什么是logits,SOFTMAX和softmax_cross_entropy_with_logit

2019-06-17 10:11发布

我正想通过tensorflow API文档在这里 。 在tensorflow文档中,他们使用了一种名为关键字logits 。 它是什么? 在很多的API文档的方法它是这样写

tf.nn.softmax(logits, name=None)

如果写的是什么是那些logits只有Tensors ,为什么保持一个不同的名称,如logits

另一件事是,有两种方法我无法区分。 他们是

tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

它们之间有什么区别? 该文档是我不清楚。 我知道tf.nn.softmax一样。 而不是其他。 一个例子是很有益的。

Answer 1:

Logits简单地意味着该函数在较早的层的未缩放输出操作,并且该相对尺度来了解单位是线性的。 这意味着,特别的输入端可能会不等于1,表示值概率的总和(您可能需要的5输入)。

tf.nn.softmax产生施加的只是结果SOFTMAX功能到输入张量。 所述SOFTMAX“squishes”的输入,使sum(input) = 1 :它是归一化的方法。 一个SOFTMAX的输出的形状是一样的输入:它只是归一化值。 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]]

相比之下, tf.nn.softmax_cross_entropy_with_logits计算结果的交叉熵应用SOFTMAX功能之后(但在数学上更谨慎的方式做这一切在一起)。 它类似的结果:

sm = tf.nn.softmax(x)
ce = cross_entropy(sm)

的交叉熵是概要度量:它横跨元件总结。 的输出tf.nn.softmax_cross_entropy_with_logits上的形状[2,5]张量是形状的[2,1]第一维度被视为批次)。

如果你想要做的优化,以尽量减少交叉熵你是你的最后一层后softmaxing,你应该使用tf.nn.softmax_cross_entropy_with_logits ,而不是自己做的,因为它涵盖了数值不稳定的极端情况在数学上正确的方式。 否则,你最终会通过在这里和那里加入少许epsilons盗号的。

编辑2016年2月7日:如果您有单级标记,其中一个对象只能属于一个类别,你可以现在考虑使用tf.nn.sparse_softmax_cross_entropy_with_logits ,这样你就不用你的标签转换为一个密-hot阵列。 发布0.6.0后加入此功能。



Answer 2:

精简版:

假设有两台张量,其中y_hat包含计算分数为每个类(例如,与y = W * X + b)和y_true包含一个热编码真标签。

y_hat  = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded

如果您解释分数y_hat作为非标准化数概率,那么他们logits。

此外,该总交叉熵损失计算以这种方式:

y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))

基本上等同于总交叉熵损失与函数计算softmax_cross_entropy_with_logits()

total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))

龙版本:

在你的神经网络的输出层,你可能会计算包含类分数为每个训练实例,如计算阵列y_hat = W*x + b 。 作为一个例子,下面我已经创建了一个y_hat作为2×3阵列,其中,所述行对应于训练实例和列对应于类。 因此,这里有2个训练实例3班。

import tensorflow as tf
import numpy as np

sess = tf.Session()

# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5,  1.5,  0.1],
#        [ 2.2,  1.3,  1.7]])

请注意,值不归(即各行加起来也不到1)。 为了归一化它们,我们可以应用SOFTMAX功能,解释输入作为非标准化对数概率(又名logits)和归一化线性概率输出。

y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863  ,  0.61939586,  0.15274114],
#        [ 0.49674623,  0.20196195,  0.30129182]])

重要的是要充分了解什么SOFTMAX输出在说什么。 下面我展示了更清晰地表示上述输出的表。 可以看出的是,例如,训练实例1层的存在“2级”的概率为0.619。 每个训练实例的类概率归一化,使每行的总和为1.0。

                      Pr(Class 1)  Pr(Class 2)  Pr(Class 3)
                    ,--------------------------------------
Training instance 1 | 0.227863   | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182

所以现在我们有一流的概率为每个训练实例,在这里我们可以把每行的argmax()来生成最终的分类。 从上面,我们可以生成训练实例1属于“2类”和训练实例2属于“级1”。

在这些分类是否正确? 我们需要衡量训练组真实的标签。 您将需要一个独热编码y_true阵列,其中再行训练实例和列类。 下面我已经创建了一个示例y_true独热阵列,其中用于训练实例1中的正确标签为“2级”和用于训练实例2中的正确标签为“3级”。

y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0.,  1.,  0.],
#        [ 0.,  0.,  1.]])

是概率分布y_hat_softmax接近的概率分布y_true ? 我们可以用交叉熵损失来衡量的误差。

我们可以计算逐行基础上的交叉熵损失和看到的结果。 下面我们可以看到,训练实例1有0.479亏损,同时培养实例2具有的1.200更高的损失。 这一结果是有道理的,因为在上面的例子中, y_hat_softmax表明,训练实例1的最高概率为“2级”,它匹配在训练实例1 y_true ; 然而,对于训练实例2中的预测显示出对“级1”的概率最高,这不匹配真类“3级”。

loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 ,  1.19967598])

我们真正需要的是在所有的训​​练实例的全部损失。 因此,我们可以计算:

total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944

使用softmax_cross_entropy_with_logits()

我们可以代替计算使用的总横熵损失tf.nn.softmax_cross_entropy_with_logits()函数,如下所示。

loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 ,  1.19967598])

total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922

需要注意的是total_loss_1total_loss_2生产具有非常最后的数字有些小的差异本质上相同的结果。 但是,你还不如用第二种方法:它需要的代码少了一个线和累积数值误差少,因为被添加Softmax为你做内softmax_cross_entropy_with_logits()



Answer 3:

tf.nn.softmax计算通过SOFTMAX层的向前传播。 你当你计算概率的模型输出模型的评估过程中使用它。

tf.nn.softmax_cross_entropy_with_logits计算用于一个SOFTMAX层的成本。 这在训练中才会被使用。

的logits是用非标准化数概率输出的模型(SOFTMAX归一化之前输出的值被施加到它们)。



Answer 4:

以上答案都在问的问题不够说明。

添加到的是,已经Tensorflow优化施加激活函数,然后使用其自己的激活,随后的成本函数计算成本的操作。 因此,它是一个很好用的做法: tf.nn.softmax_cross_entropy()tf.nn.softmax(); tf.nn.cross_entropy() tf.nn.softmax(); tf.nn.cross_entropy()

您可以在资源集约型两者之间存在显着差异。



文章来源: What is logits, softmax and softmax_cross_entropy_with_logits?