首页 文章

在带有单热标签的两类问题中,为什么tf.losses.softmax_cross_entropy会输出非常大的成本[重复]

提问于
浏览
1

这个问题在这里已有答案:

我正在培训一个用于语义分段的移动网络 . 目标有两个类:foreground(1)或background(0) . 所以这是一个两类分类问题 . 我选择softmax交叉熵作为损失,使用如下的python代码:

tf.losses.softmax_cross_entropy(self.targets, logits)

目标和日志的大小为 [batch_size, 224, 224, 2] . 然而,100批次后损失变得非常大,曲线是这样的:

enter image description here

从tf的api docus,我知道 tf.losses.softmax_cross_entropy 有[batch_size,num_classes]目标单热编码标签,它与我的标签大小 [batch_size,224,224,2] 一致,1或0(这是独占的) . 那么,softmax_cross_entropy不能用于这样的两类单热标签案例,为什么呢?如果可以使用,我的问题在哪里?

如果我使用 tf.losses.sigmoid_cross_entropytf.losses.sparse_softmax_cross_entropy (仅给出标签尺寸: [batch_size, 224,224,1] ),损失将会收敛 .

1 回答

  • 0

    tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_entropy 的输入目标格式不同 .

    对于sparse_softmax_cross_entropy_with_logits标签,其形状必须为[batch_size],dtype为int32或int64 . 每个标签都是范围为[0,num_classes-1]的int . 对于softmax_cross_entropy_with_logits,标签的形状必须为[batch_size,num_classes]和dtype float32或float64 . softmax_cross_entropy_with_logits中使用的标签是sparse_softmax_cross_entropy_with_logits中使用的标签的一个热门版本 .

    参考:TensorFlow: what's the difference between sparse_softmax_cross_entropy_with_logits and softmax_cross_entropy_with_logits?

    因此,要使其使用 softmax_cross_entropy_with_logits 工作,您必须在标签上执行tf.one_hot .

相关问题