这个问题在这里已有答案:
我正在培训一个用于语义分段的移动网络 . 目标有两个类:foreground(1)或background(0) . 所以这是一个两类分类问题 . 我选择softmax交叉熵作为损失,使用如下的python代码:
tf.losses.softmax_cross_entropy(self.targets, logits)
目标和日志的大小为 [batch_size, 224, 224, 2]
. 然而,100批次后损失变得非常大,曲线是这样的:
从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_entropy
或 tf.losses.sparse_softmax_cross_entropy
(仅给出标签尺寸: [batch_size, 224,224,1]
),损失将会收敛 .
1 回答
tf.losses.softmax_cross_entropy
和tf.losses.sparse_softmax_cross_entropy
的输入目标格式不同 .参考: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 .