TensorFlow:我的logits是否采用正确的交叉熵函数格式?

时间:2016-03-18 07:21:58

标签: tensorflow cross-entropy

好的,所以我准备在Tensorflow中运行tf.nn.softmax_cross_entropy_with_logits()函数。

我的理解是'logits'应该是概率张量,每个概率对应于某个像素的概率,它是图像的一部分,最终将成为“狗”或“卡车”或其他什么。有限数量的东西。

这些logits将插入到这个交叉熵方程中: Cross entropy formula from Wikipedia

据我了解,logits插入等式的右侧。也就是说,它们是每个x(图像)的q。如果它们的概率从0到1 ......这对我来说是有意义的。但是当我运行我的代码并最终得到一些logits时,我没有得到概率。相反,我得到了正面和负面的浮动:

-0.07264724 -0.15262917  0.06612295 ..., -0.03235611  0.08587133 0.01897052 0.04655019 -0.20552202  0.08725972 ..., -0.02107313 -0.00567073 0.03241089 0.06872301 -0.20756687  0.01094618 ...,   etc

所以我的问题是......是吗?我是否必须以某种方式计算所有的logits并将它们转换为从0到1的概率?

1 个答案:

答案 0 :(得分:16)

需要注意的一点是,tf.nn.softmax_cross_entropy_with_logits(logits, labels)会在logits的每一行上执行内部softmax,以便 在将它们输入交叉熵之前解释为概率方程。

因此,“logits”不一定是概率(甚至是真正的日志概率,正如名称所暗示的那样),因为在该操作中发生了内部规范化。

另一种写作方式:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)

......将是:

softmax = tf.nn.softmax(logits)
xent = -tf.reduce_sum(labels * tf.log(softmax), 1)

然而,这种替代方案将是(i)在数值上更不稳定(因为softmax可以计算更大的值)和(ii)效率更低(因为在backprop中会发生一些冗余计算)。对于实际用途,我们建议您使用tf.nn.softmax_cross_entropy_with_logits()