6

好的,所以我准备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

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

4

1 回答 1

16

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

因此,“ 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) 效率较低(因为在反向传播中会发生一些冗余计算)。对于实际使用,我们建议您使用tf.nn.softmax_cross_entropy_with_logits().

于 2016-03-18T14:05:12.543 回答