tf.nn.softmax_cross_entropy_with_logits
和 tf.losses.log_loss
之间的主要区别是什么?这两种方法都接受 1-hot 标签和 logits 来计算分类任务的交叉熵损失。
最佳答案
这些方法在理论上没有太大的不同,但是在实现上有很多不同:
1) tf.nn.softmax_cross_entropy_with_logits
设计用于单类标签,而 tf.losses.log_loss
可用于多类分类。如果您提供多类标签,tf.nn.softmax_cross_entropy_with_logits
不会抛出错误,但是您的梯度将无法正确计算并且训练很可能会失败。
来自官方文档:
2) tf.nn.softmax_cross_entropy_with_logits
首先在您的预测之上计算(从名称中可以看出)soft-max 函数,而 log_loss 不这样做。
3) tf.losses.log_loss
在某种意义上具有更广泛的功能,您可以对损失函数的每个元素进行加权,或者您可以指定用于计算的 epsilon
以避免 log(0) 值。
4) 最后,tf.nn.softmax_cross_entropy_with_logits
返回批处理中每个条目的损失,而 tf.losses.log_loss
返回减少的(默认为所有样本的总和)值,可直接用于优化器。
UPD: 另一个区别是计算损失的方式,对数损失考虑了负类(向量中有 0 的那些)。很快,交叉熵损失迫使网络为正确的类产生最大输入,而不关心负类。对数损失同时进行,它迫使正确的类具有更大的值而负值更小。在数学表达式中它看起来如下:
交叉熵损失:
对数损失:
其中 i 是相应的类。
因此,例如,如果您有 labels=[1,0] 和 predictions_with_softmax = [0.7,0.3],那么:
1) 交叉熵损失:-(1 * log(0.7) + 0 * log(0.3)) = 0.3567
2) 对数损失: - (1*log(0.7) + (1-1) * log(1 - 0.7) +0*log(0.3) + (1-0) log (1- 0.3)) = - (log (0.7) + 对数 (0.7)) = 0.7133
然后,如果您使用 tf.losses.log_loss
的默认值,则需要将 log_loss
输出除以非零元素的数量(此处为 2)。所以最后:tf.nn.log_loss = 0.7133/2 = 0.3566
在这种情况下,我们得到了相等的输出,但情况并非总是如此
关于tensorflow - softmax_cross_entropy_with_logits 和 loss.log_loss 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47245113/