tensorflow:用reduce_mean和reduce_sum理解交叉熵计算

时间:2016-08-01 11:06:42

标签: function tensorflow reduce cross-entropy

我正在为初学者看一下Tensorflow的基本神经网络[1]。我无法理解熵值的计算及其使用方法。在示例中,创建了一个占位符来保存正确的标签:

y_ = tf.placeholder(tf.float32, [None, 10])

和交叉熵,sum y' .log(y),计算如下:

reduct = -tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])
cross_entropy = tf.reduce_mean( reduct )

观察我假设的尺寸(元素乘法):

y_ * log(y)= [批次x类] x [批次x类]

y_ * log(y)= [批次x类]

快速检查确认了这一点:

y_ * tf.log(y)
<tf.Tensor 'mul_8:0' shape=(?, 10) dtype=float32>

现在这是我不明白的。我的理解是,对于交叉熵,我们需要考虑y(预测)和y_(oracle)的分布。所以我假设我们首先需要 reduce_mean 的y和y_的列(按类)。然后我会得到2个大小的矢量:

y_ = [class x 1]

y = [class x 1]

因为y_是&#34;正确&#34;然后我们做一个(注意在示例中向量被翻转):

log(y_)= [classes x 1]

现在我们进行元素明智的乘法运算:

y x log(y _)

它为我们提供了一个具有类长度的向量。最后,我们简单地将此向量求和以获得单个值:

Hy(y_)= sum(y x log(y_))

但是,这似乎不是正在执行的计算。任何人都可以解释我的错误是什么?也许请指点一些页面,并附上一个很好的解释。除此之外,我们使用的是单热编码。因此log(1)= 0并且log(0)= -infinity因此这将导致计算错误。我知道优化器会计算导数,但是交叉熵是否仍然计算?

TIA。

[1] https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html

1 个答案:

答案 0 :(得分:0)

您描述的大部分内容都是正确的。但是:

  

我的理解是,对于交叉熵,我们需要考虑   y(预测)和y_(oracle)的分布。所以我假设我们   首先需要reduce_mean的y和y_的列(by   类)。

首先,您需要创建一个向量(在您的情况下,每个batch_member有10个元素,然后添加批处理)然后reduce_means它以获得单个数字。因此,事物的正确顺序是比较y和y_元素,然后减少。

关于log(0)-problem:这就是你经常看到的原因

reduct = -tf.reduce_sum(y_ * tf.log(y + 1e-5), reduction_indices=[1])