在tensorflow API文档中,他们使用了一个名为logits
的关键词。这是什么意思?很多方法的写法类似于:
tf.nn.softmax(logits, name=None)
如果logits
只是一个通用的Tensor
输入,为什么要命名为logits
?
其次,以下两种方法有什么区别?
tf.nn.softmax(logits, name=None)tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
我知道tf.nn.softmax
的作用,但不了解另一个方法。一个例子会非常有帮助。
回答:
softmax+logits简单来说就是指该函数对早期层的未缩放输出进行操作,并且理解单位的相对尺度是线性的。这意味着输入的总和可能不等于1,这些值并不是概率(你的输入可能是5)。在内部,它首先对未缩放的输出应用softmax,然后计算这些值与标签定义的“应有”值之间的交叉熵。
tf.nn.softmax
产生对输入张量应用softmax函数的结果。softmax函数“压缩”输入,使得sum(input) = 1
,它通过将输入解释为对数概率(logits),然后将它们转换回0到1之间的原始概率来进行映射。softmax的输出形状与输入相同:
a = tf.constant(np.array([[.1, .3, .5, .9]]))print s.run(tf.nn.softmax(a))[[ 0.16838508 0.205666 0.25120102 0.37474789]]
有关为什么在深度神经网络中广泛使用softmax的更多信息,请参见这个回答。
tf.nn.softmax_cross_entropy_with_logits
将softmax步骤与应用softmax函数后的交叉熵损失计算结合在一起,但它以一种更数学上谨慎的方式完成所有操作。这类似于以下操作的结果:
sm = tf.nn.softmax(x)ce = cross_entropy(sm)
交叉熵是一个汇总指标:它对元素进行求和。tf.nn.softmax_cross_entropy_with_logits
对形状为[2,5]
的张量输出的形状为[2,1]
(第一维被视为批次)。
如果你想通过优化来最小化交叉熵,并且你在最后一层之后进行softmax操作,你应该使用tf.nn.softmax_cross_entropy_with_logits
,而不是自己做,因为它以数学上正确的方式处理了数值不稳定的极端情况。否则,你将不得不通过在这里那里添加小epsilon来进行修补。
编辑于2016-02-07:如果你有单类标签,其中一个对象只能属于一个类,你现在可以考虑使用tf.nn.sparse_softmax_cross_entropy_with_logits
,这样你就不必将你的标签转换为密集的一热数组。这个函数是在0.6.0版本之后添加的。