计算TensorFlow中的交叉熵

Dav*_*tan 8 python machine-learning tensorflow cross-entropy

我在计算张量流中的交叉熵时遇到了困难.特别是,我使用的功能:

tf.nn.softmax_cross_entropy_with_logits()
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

回报

0
Run Code Online (Sandbox Code Playgroud)

我对交叉熵的理解如下:

H(p,q) = p(x)*log(q(x))
Run Code Online (Sandbox Code Playgroud)

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

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

0<p(x)<1 AND 0<q(x)<1
Run Code Online (Sandbox Code Playgroud)

应该有一个非零交叉熵.我期待我正在使用tensorflow错误.在此先感谢您的帮助.

Fra*_*urt 16

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

另一种写作方式:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels)
Run Code Online (Sandbox Code Playgroud)

...将会:

softmax = tf.nn.softmax(logits)
xent = -tf.reduce_sum(labels * tf.log(softmax), 1)
Run Code Online (Sandbox Code Playgroud)

然而,这种替代方案将是(i)在数值上更不稳定(因为softmax可以计算更大的值)和(ii)效率更低(因为在backprop中会发生一些冗余计算).对于实际用途,我们建议您使用 tf.nn.softmax_cross_entropy_with_logits().

  • 感谢(no-softmax)交叉熵公式 (2认同)

Don*_*eba 13

就像他们说的那样,没有"softmax"就不能拼写"softmax_cross_entropy_with_logits".Softmax [0.45][1],log(1)0.

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

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

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

警告:此操作需要未缩放的日志记录,因为它softmaxlogits内部执行开启以提高效率.不要使用输出调用此op softmax,因为它会产生不正确的结果.

logits并且labels必须具有相同的形状[batch_size, num_classes] 和相同的D型细胞(无论是float16,float32,或float64).