我正在为初学者看一下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
答案 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])