好的,所以我准备在Tensorflow中运行tf.nn.softmax_cross_entropy_with_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的概率?
答案 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()
。