0

我正在尝试使用 TensorFlow 实现多标签分类(即,每个输出模式可以有许多活动单元)。该问题具有不平衡的类别(即,标签分布中的零比零多得多,这使得标签模式非常稀疏)。

解决问题的最佳方法应该是使用该tf.nn.weighted_cross_entropy_with_logits功能。但是,我收到此运行时错误:

ValueError: Tensor conversion requested dtype uint8 for Tensor with dtype float32

我不明白这里有什么问题。作为损失函数的输入,我传递了标签张量、logits 张量和正类权重,这是一个常数:

positive_class_weight = 10
loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)

关于如何解决这个问题的任何提示?如果我只是将相同的标签和 logits 张量传递给tf.losses.sigmoid_cross_entropy损失函数,那么一切正常(在 Tensorflow 运行正常的意义上,但当然训练预测总是为零)。

在此处查看相关问题。

4

1 回答 1

2

错误很可能在损失函数之后抛出,因为 和 之间唯一显着的区别tf.losses.sigmoid_cross_entropy返回的张量tf.nn.weighted_cross_entropy_with_logits的形状。

看看这个例子:

logits = tf.linspace(-3., 5., 10)
labels = tf.fill([10,], 1.)

positive_class_weight = 10
weighted_loss = tf.nn.weighted_cross_entropy_with_logits(targets=labels, logits=logits, pos_weight=positive_class_weight)
print(weighted_loss.shape)

sigmoid_loss = tf.losses.sigmoid_cross_entropy(multi_class_labels=labels, logits=logits)
print(sigmoid_loss.shape)

张量logitslabels是一种人造的,都有形状(10,)。但这很重要,weighted_loss而且sigmoid_loss是不同的。这是输出:

(10,)
()

这是因为tf.losses.sigmoid_cross_entropy执行缩减(默认情况下为总和)。所以为了复制它,你必须用tf.reduce_sum(...).

如果这没有帮助,请确保labels张量具有 type float32。这个错误很容易产生,例如,以下声明不起作用:

labels = tf.fill([10,], 1)  # the type is not float!

您可能也有兴趣阅读这个问题

于 2017-12-18T12:59:06.957 回答