在 TensorFlow 中计算交叉熵

新手上路,请多包涵

我很难计算张量流中的交叉熵。特别是,我正在使用以下功能:

 tf.nn.softmax_cross_entropy_with_logits()

使用看似简单的代码,我只能让它返回一个零

import tensorflow as tf
import numpy as np

sess = tf.InteractiveSession()

a = tf.placeholder(tf.float32, shape =[None, 1])
b = tf.placeholder(tf.float32, shape = [None, 1])
sess.run(tf.global_variables_initializer())
c = tf.nn.softmax_cross_entropy_with_logits(
    logits=b, labels=a
).eval(feed_dict={b:np.array([[0.45]]), a:np.array([[0.2]])})
print c

回报

0

我对交叉熵的理解是这样的:

 H(p,q) = p(x)*log(q(x))

其中 p(x) 是事件 x 的真实概率,q(x) 是事件 x 的预测概率。

如果输入 p(x) 和 q(x) 的任意两个数字,则使用这样的

0<p(x)<1 AND 0<q(x)<1

应该有一个非零交叉熵。我期望我错误地使用了 tensorflow。在此先感谢您的帮助。

原文由 David Kaftan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 426
2 个回答

就像他们说的,没有“softmax”就不能拼写“softmax_cross_entropy_with_logits”。 [0.45] 的Softmax是 [1] ,和 log(1)0

测量离散分类任务中的概率误差,其中类相互排斥(每个条目恰好属于一个类)。例如,每张 CIFAR-10 图像都标有一个且只有一个标签:图像可以是狗或卡车,但不能同时是两者。

注意: 虽然类别是相互排斥的,但它们的概率不一定是。所需要的只是 labels 的每一行都是有效的概率分布。如果不是,则梯度的计算将不正确。

如果使用独占 labels (其中一次只有一个类为真),请参阅 sparse_softmax_cross_entropy_with_logits

警告: 此操作需要未缩放的 logits,因为它在内部执行 softmax logits 以提高效率。不要使用 softmax 的输出调用此操作,因为它会产生不正确的结果。

logits and labels must have the same shape [batch_size, num_classes] and the same dtype (either float16 , float32 , or float64 )。

原文由 Don Reba 发布,翻译遵循 CC BY-SA 3.0 许可协议

除了 Don 的答案(+1)之外, mrry 写的这个答案 可能会让你感兴趣,因为它给出了计算 TensorFlow 中交叉熵的公式:

另一种写法:

 xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)

…将是:

 softmax = tf.nn.softmax(logits)
xent = -tf.reduce_sum(labels * tf.log(softmax), 1)

然而,这种替代方案将 (i) 数值稳定性较低(因为 softmax 可能计算出更大的值)和 (ii) 效率较低(因为反向传播中会发生一些冗余计算)。对于实际用途,我们建议您使用 tf.nn.softmax_cross_entropy_with_logits()

原文由 Franck Dernoncourt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题