什么是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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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