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

时间:2018-01-18 08:17:16

标签: python tensorflow

我正在培训一个用于语义分段的移动网络。目标有两个类: 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 :(得分: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中使用的标签版本。

参考:documentation

因此,要使用sparse_softmax_cross_entropy_with_logits使其正常工作,您必须在标签上执行TensorFlow: what's the difference between sparse_softmax_cross_entropy_with_logits and softmax_cross_entropy_with_logits?