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

mcE*_*nge 9 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]
Run Code Online (Sandbox Code Playgroud)

现在根据我自己的计算我只得[1.23]手动计算时,我只是应用softmax

在此输入图像描述

和交叉熵:

在此输入图像描述

在哪里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上找不到的函数...

Dmi*_*kiy 6

好吧,通常p(x)在交叉熵方程中是真实分布,而q(x)从softmax获得的分布。因此,如果p(x)是 one-hot(确实如此,否则无法应用稀疏交叉熵),则交叉熵只是真实类别概率的负对数。

在您的示例中,softmax(logits)是一个带有 values 的向量[0.09003057, 0.24472847, 0.66524096],因此损失-log(0.24472847) = 1.4076059正是您作为输出获得的。