什么是logits?softmax和softmax_cross_entropy_with_logits有什么区别?

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版本之后添加的。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注