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