首页 文章

softmax_cross_entropy_with_logits和loss.log_loss之间有什么区别?

提问于
浏览
3

tf.nn.softmax_cross_entropy_with_logitstf.losses.log_loss 之间的主要区别是什么?两种方法都接受1-hot标签和logits来计算分类任务的交叉熵损失 .

2 回答

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

    交叉骚扰损失:

    enter image description here

    对数损失:

    enter image description here

    我在哪里是相应的 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

    在这种情况下,我们获得了相同的输出,但情况并非总是如此

  • 0

    两者之间基本上有两点不同,

    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 仅接受具有单热编码的标签 .

    希望这可以帮助 .

相关问题