我正在培训一个用于语义分段的移动网络。目标有两个类: 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]
),则损失将会收敛。
答案 0 :(得分:0)
let xhr = new XMLHttpRequest();
let url = 'https://api-ssl.bitly.com/v3/shorten?longUrl=https://google.com/&access_token=token'
xhr.open('GET', url);
xhr.onreadystatechange = function() {
if(xhr.readyState === 4) {
if(xhr.status===200) {
console.log(xhr.responseText)
} else {
console.log(xhr)
}
}
};
xhr.send();
和tf.losses.softmax_cross_entropy
的输入目标格式不同。
tf.losses.sparse_softmax_cross_entropy
标签必须具有形状 [batch_size]和dtype int32或int64。每个标签都是一个int range [0,num_classes-1]。- 对于
sparse_softmax_cross_entropy_with_logits
,标签的形状必须为[batch_size,num_classes],dtype为float32或float64。
softmax_cross_entropy_with_logits
中使用的标签是最热门的标签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?。