tf.nn.softmax_cross_entropy_with_logitstf.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 的那些)。很快,交叉熵损失迫使网络为正确的类产生最大输入,而不关心负类。对数损失同时进行,它迫使正确的类具有更大的值而负值更小。在数学表达式中它看起来如下:

交叉熵损失:

tensorflow - softmax_cross_entropy_with_logits 和 loss.log_loss 有什么区别?-LMLPHP

对数损失:

tensorflow - softmax_cross_entropy_with_logits 和 loss.log_loss 有什么区别?-LMLPHP

其中 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/

10-11 23:18
查看更多