我正想通过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
一样。 而不是其他。 一个例子是很有益的。
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后加入此功能。
精简版:
假设有两台张量,其中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_1
和total_loss_2
生产具有非常最后的数字有些小的差异本质上相同的结果。 但是,你还不如用第二种方法:它需要的代码少了一个线和累积数值误差少,因为被添加Softmax为你做内softmax_cross_entropy_with_logits()
tf.nn.softmax
计算通过SOFTMAX层的向前传播。 你当你计算概率的模型输出模型的评估过程中使用它。
tf.nn.softmax_cross_entropy_with_logits
计算用于一个SOFTMAX层的成本。 这在训练中才会被使用。
的logits是用非标准化数概率输出的模型(SOFTMAX归一化之前输出的值被施加到它们)。
以上答案都在问的问题不够说明。
添加到的是,已经Tensorflow优化施加激活函数,然后使用其自己的激活,随后的成本函数计算成本的操作。 因此,它是一个很好用的做法: tf.nn.softmax_cross_entropy()
在tf.nn.softmax(); tf.nn.cross_entropy()
tf.nn.softmax(); tf.nn.cross_entropy()
您可以在资源集约型两者之间存在显着差异。