tf.nn.softmax_cross_entropy_with_logits 和 tf.losses.log_loss 之间的主要区别是什么?两种方法都接受1-hot标签和logits来计算分类任务的交叉熵损失 .
tf.nn.softmax_cross_entropy_with_logits
tf.losses.log_loss
这些方法在理论上没有那么不同,但在实施方面有许多不同之处:
1) tf.nn.softmax_cross_entropy_with_logits 是为单类标签设计的,而 tf.losses.log_loss 可用于多类分类 . tf.nn.softmax_cross_entropy_with_logits 赢得't throw an error if you feed multi-class labels, however your gradients won' t正确计算,训练最有可能失败 .
从官方文件:
注意:虽然这些类是互斥的,但它们的概率不一定是 . 所需要的只是每行标签是有效的概率分布 . 如果不是,则梯度的计算将是不正确的 .
2) tf.nn.softmax_cross_entropy_with_logits 计算(因为它's seen from the name) soft-max function on top of your predictions first, while log_loss doesn' t这样做 .
3) tf.losses.log_loss 在某种意义上具有更广泛的功能,您可以对损失函数的每个元素进行加权,或者您可以指定 epsilon (用于计算)以避免log(0)值 .
epsilon
4)最后, tf.nn.softmax_cross_entropy_with_logits 返回批处理中每个条目的丢失,而 tf.losses.log_loss 返回减少(默认情况下所有样本的总和)值,可以直接在优化器中使用 .
UPD: 另一个区别是计算损失的方式,对数损失考虑了负类(向量中有0的那些) . 不久,交叉熵损失迫使网络为正确的类产生最大输入,而不关心负类 . 对数损失同时发生,它迫使正确的类具有更大的值和负的更小 . 在数学表达式中,它看起来如下:
交叉骚扰损失:
对数损失:
我在哪里是相应的 class .
例如,如果您有labels = [1,0]和predicttions_with_softmax = [0.7,0.3],那么:
1)Cross-Enthropy Loss: - (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) log(0.7))= 0.7133
然后,如果您使用 tf.losses.log_loss 的默认值,则需要将 log_loss 输出除以非零元素的数量(此处为2) . 最后:tf.nn.log_loss = 0.7133 / 2 = 0.3566
log_loss
在这种情况下,我们获得了相同的输出,但情况并非总是如此
两者之间基本上有两点不同,
1) tf.nn.softmax_cross_entropy_with_logits 中使用的标签是 tf.losses.log_loss 中使用的标签的一个热门版本 .
2) tf.nn.softmax_cross_entropy_with_logits 在计算交叉熵之前在内部计算 softmax 的logits .
请注意, tf.losses.log_loss 也接受单热编码标签 . 但是, tf.nn.softmax_cross_entropy_with_logits 仅接受具有单热编码的标签 .
希望这可以帮助 .
2 回答
这些方法在理论上没有那么不同,但在实施方面有许多不同之处:
1)
tf.nn.softmax_cross_entropy_with_logits
是为单类标签设计的,而tf.losses.log_loss
可用于多类分类 .tf.nn.softmax_cross_entropy_with_logits
赢得't throw an error if you feed multi-class labels, however your gradients won' t正确计算,训练最有可能失败 .从官方文件:
2)
tf.nn.softmax_cross_entropy_with_logits
计算(因为它's seen from the name) soft-max function on top of your predictions first, while log_loss doesn' t这样做 .3)
tf.losses.log_loss
在某种意义上具有更广泛的功能,您可以对损失函数的每个元素进行加权,或者您可以指定epsilon
(用于计算)以避免log(0)值 .4)最后,
tf.nn.softmax_cross_entropy_with_logits
返回批处理中每个条目的丢失,而tf.losses.log_loss
返回减少(默认情况下所有样本的总和)值,可以直接在优化器中使用 .UPD: 另一个区别是计算损失的方式,对数损失考虑了负类(向量中有0的那些) . 不久,交叉熵损失迫使网络为正确的类产生最大输入,而不关心负类 . 对数损失同时发生,它迫使正确的类具有更大的值和负的更小 . 在数学表达式中,它看起来如下:
交叉骚扰损失:
对数损失:
我在哪里是相应的 class .
例如,如果您有labels = [1,0]和predicttions_with_softmax = [0.7,0.3],那么:
1)Cross-Enthropy Loss: - (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) log(0.7))= 0.7133
然后,如果您使用
tf.losses.log_loss
的默认值,则需要将log_loss
输出除以非零元素的数量(此处为2) . 最后:tf.nn.log_loss = 0.7133 / 2 = 0.3566在这种情况下,我们获得了相同的输出,但情况并非总是如此
两者之间基本上有两点不同,
1)
tf.nn.softmax_cross_entropy_with_logits
中使用的标签是tf.losses.log_loss
中使用的标签的一个热门版本 .2)
tf.nn.softmax_cross_entropy_with_logits
在计算交叉熵之前在内部计算 softmax 的logits .请注意,
tf.losses.log_loss
也接受单热编码标签 . 但是,tf.nn.softmax_cross_entropy_with_logits
仅接受具有单热编码的标签 .希望这可以帮助 .