我正在训练一个mobilenet来进行tf的语义分割。目标有两类:前景(1)或背景(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,224,224,2]
的标签一致,要么是1,要么是0(排他)。
所以,softmax_cross_熵不能用于这样一个两类一类的热标签案例,为什么?如果可以用,我的问题在哪里?在
如果我使用tf.losses.sigmoid_cross_entropy
或tf.losses.sparse_softmax_cross_entropy
(只给出标签大小:[batch_size, 224,224,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。在相关问题 更多 >
编程相关推荐