我正在研究面向初学者的 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
(predicted) 和y_
(oracle) 的分布。所以我假设我们首先需要reduce_mean
y 和y_
by 他们的列(按类)。然后我会得到2个大小的向量:
y_ = [类 x 1]
y = [类 x 1]
由于 y_ 是“正确的”分布,我们然后做一个(注意在示例中向量被翻转):
log(y_) = [ 类 x 1 ]
现在我们做一个元素明智的乘法:
yx 日志(y_)
这给了我们一个带有类长度的向量。最后我们简单地将这个向量相加得到一个值:
Hy(y_) = sum( yx log(y_) )
但是,这似乎不是正在执行的计算。谁能解释我的错误是什么?也许将我指向一些有很好解释的页面。除此之外,我们正在使用 one-hot 编码。所以 log(1) = 0 和 log(0) = -infinity 所以这会导致计算错误。我知道优化器会计算导数,但交叉熵不是还在计算吗?
TIA。
[1] https://www.tensorflow.org/versions/r0.9/tutorials/mnist/beginners/index.html