2017-03-01 225 views
5

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

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 

应该有一个非零交叉熵。我期待着我正在使用张量流。预先感谢您的帮助。

+0

于是,有趣的是我得到了使用交叉熵从这个项目的想法: https://github.com/carpedm20/DCGAN-tensorflow/blob/master/model.py他们正在使用它 到确定样本是否来自实际分布。然而,似乎二元softmax回归与逻辑回归相同。 –

回答

7

就像他们说的,你不能在没有“softmax”的情况下拼写“softmax_cross_entropy_with_logits”。 [0.45]的Softmax是[1],并且log(1)0

措施的概率误差离散分类任务,其中 类是互斥的(每个条目是在恰好一个类)。对于 示例,每个CIFAR-10图像都标有一个且仅有一个标签:图像 可以是狗或卡车,但不能同时为两个。

注意:尽管类是互斥的,但它们的概率 不一定是。所有需要的是labels的每一行是 有效的概率分布。如果它们不是,那么梯度的计算将是不正确的。

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

警告:该运预计未缩放logits,因为它提高效率上执行logits一个softmax 内部。不要用 输出softmax调用此操作,因为它会产生不正确的结果。

logitslabels必须具有相同的形状[batch_size, num_classes] 和相同的D型细胞(无论是float16float32,或float64)。

+0

啊哈!所以看来我的问题是由于对softmax的误解造成的!感谢您的帮助! –

+0

@DavidKaftan,如果这可以解决您的问题,将其标记为可接受的答案将是很好的。 :) –

+1

谢谢!我很明显是新来的! –

7

除了唐的回答(+1),this answer written by 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) 

然而,这竟被替代d是(ⅰ)以下数值稳定(因为 的SOFTMAX可以计算大得多的值)和(ii)低效率 (因为一些冗余计算将在backprop发生)。对于 的实际用途,我们建议您使用 tf.nn.softmax_cross_entropy_with_logits()

+2

感谢您使用(no-softmax)交叉熵公式 – alanwsx