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

rik*_*mbo 6 tensorflow cross-entropy

好吧,所以我准备tf.nn.softmax_cross_entropy_with_logits()在Tensorflow中运行该功能.

我的理解是'logits'应该是一个概率张量,每一个都对应于一个像素的概率,它是图像的一部分,最终将成为"狗"或"卡车"或其他......有限的事情的数量.

这些logits将插入到这个交叉熵方程中: 来自维基百科的交叉熵公式

据我了解,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
Run Code Online (Sandbox Code Playgroud)

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

mrr*_*rry 16

要注意的关键的东西是tf.nn.softmax_cross_entropy_with_logits(logits, labels)执行上的每一行的内部SOFTMAX logits让他们解释成概率,他们被送到交叉熵公式之前.

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

另一种写作方式:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
Run Code Online (Sandbox Code Playgroud)

...将会:

softmax = tf.nn.softmax(logits)
xent = -tf.reduce_sum(labels * tf.log(softmax), 1)
Run Code Online (Sandbox Code Playgroud)

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