tf.nn.softmax_cross_entropy_with_logits
和tf.losses.log_loss
之间的主要区别是什么?两种方法都接受1-hot标签和logits来计算分类任务的交叉熵损失。
答案 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的那些)。不久,交叉熵损失迫使网络为正确的类产生最大输入,而不关心负类。对数损失同时发生,它迫使正确的类具有更大的值和负的更小。在数学表达式中,它看起来如下:
交叉骚扰:
对数损失:
我是相应的班级。
例如,如果你有标签= [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
仅接受带有单热编码的标签。
希望这有帮助。