Tensorflow:在`tf.nn.sparse_softmax_cross_entropy_with_logits`中应用了什么确切的公式?

时间:2017-04-13 13:52:40

标签: tensorflow

我尝试手动重新计算此函数的输出,因此我创建了一个最小的示例:

logits = tf.pack(np.array([[[[0,1,2]]]],dtype=np.float32)) # img of shape (1, 1, 1, 3)
labels = tf.pack(np.array([[[1]]],dtype=np.int32)) # gt of shape (1, 1, 1)

softmaxCrossEntropie = tf.nn.sparse_softmax_cross_entropy_with_logits(logits,labels)
softmaxCrossEntropie.eval() # --> output is [1.41]

根据我自己的计算,我只得到[1.23] 手动计算时,我只是简单地应用softmax

enter image description here

和交叉熵:

enter image description here

其中q(x) = sigma(x_j) or (1-sigma(x_j))取决于j是否是正确的基础真值类,而p(x) = labels则是一个热编码的

我不确定差异可能来自哪里。我无法想象某些epsilon会产生如此大的差异。有人知道我在哪里可以查找,tensorflow使用哪个确切的公式? 该确切部分的源代码是否可用?
我只能找到nn_ops.py,但它只使用另一个名为gen_nn_ops._sparse_softmax_cross_entropy_with_logits的函数,我无法在github上找到...

1 个答案:

答案 0 :(得分:1)

嗯,交叉熵方程中的p(x)通常是真正的分布,而q(x)是从softmax获得的分布。因此,如果p(x)是一热的(这是如此,否则无法应用稀疏交叉熵),交叉熵只是真实类别概率的负对数。

在您的示例中,softmax(logits)是一个值为[0.09003057, 0.24472847, 0.66524096]的向量,因此损失为-log(0.24472847) = 1.4076059,这正是您输出的结果。