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

时间:2017-11-12 03:18:10

标签: tensorflow cross-entropy

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

2 个答案:

答案 0 :(得分:2)

这些方法在理论上没有那么不同,但在实施方面存在许多差异:

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

交叉骚扰:

enter image description here

对数损失:

enter image description here

我是相应的班级。

例如,如果你有标签= [1,0]和predictions_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 :(得分:0)

之间基本上有两个不同之处

1)fpssink = gst_element_factory_make ("fpsdisplaysink", "fpsdisplay"); ... g_object_set (G_OBJECT (fpssink), "text-overlay", TRUE, "video-sink", sink, NULL); ... g_object_get (G_OBJECT (fpssink), "last-message", &fps_msg, NULL); delay_show_FPS++; if (fps_msg != NULL) { if ((delay_show_FPS % DELAY_VALUE) == 0) { g_print ("Frame info: %s\n", fps_msg); delay_show_FPS = 0; } } 中使用的标签是tf.nn.softmax_cross_entropy_with_logits中使用的一种热门标签。

2)tf.losses.log_loss在计算交叉熵之前,在内部对 softmax 进行计算。

请注意tf.nn.softmax_cross_entropy_with_logits也接受单热编码标签。但是,tf.losses.log_loss仅接受带有单热编码的标签。

希望这有帮助。