我尝试手动重新计算此函数的输出,因此我创建了一个最小的示例:
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
和交叉熵:
其中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上找到...
答案 0 :(得分:1)
嗯,交叉熵方程中的p(x)
通常是真正的分布,而q(x)
是从softmax获得的分布。因此,如果p(x)
是一热的(这是如此,否则无法应用稀疏交叉熵),交叉熵只是真实类别概率的负对数。
在您的示例中,softmax(logits)
是一个值为[0.09003057, 0.24472847, 0.66524096]
的向量,因此损失为-log(0.24472847) = 1.4076059
,这正是您输出的结果。