• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Tensorflow加权与S形交叉熵损失

tensorflow 来源:Alberto 27次浏览

我试图用TensorFlow实现多标签分类(即每个输出模式可以有许多活动单位)。该问题具有不平衡的类(即,比标签分布中的零多得多,这使得标签模式非常稀疏)。Tensorflow加权与S形交叉熵损失

解决此问题的最佳方法应该是使用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正常运行的意义上讲,但当然,训练后的预测始终为零)。

查看相关问题here。

===========解决方案如下:

的错误很可能会丧失功能后,被抛出,因为tf.losses.sigmoid_cross_entropytf.nn.weighted_cross_entropy_with_logits之间的唯一显著差异是返回张的形状。

看看这个例子:

<code class="prettyprint-override">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) 
</code>

张量logitslabels是一种人为的,都具有形状(10,)。但重要的是weighted_losssigmoid_loss是不同的。下面是输出:

<code class="prettyprint-override">(10,) 
() 
</code>

这是因为tf.losses.sigmoid_cross_entropy进行缩小(默认的总和)。所以为了复制它,你必须用tf.reduce_sum(...)来包装加权损失。

如果这没有帮助,请确保labels张量的类型为float32。此错误是很容易做,例如,下面的声明将无法工作:

<code class="prettyprint-override">labels = tf.fill([10,], 1) # the type is not float! 
</code>

您可能也有兴趣阅读this question。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)