0

我正在研究面向初学者的 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_meany 和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

4

1 回答 1

0

你描述的大部分是正确的。然而:

我的理解是,对于交叉熵,我们需要考虑 y(预测)和 y_(oracle)的分布。所以我假设我们首先需要通过它们的列(按类)来减少 y 和 y_ 的平均值。

首先,您需要创建一个向量(在您的情况下,每个 batch_member 有 10 个元素,然后添加批次),然后 reduce_means 它得到一个数字。所以正确的事情顺序是逐元素比较y和y_,然后reduce。

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

reduct = -tf.reduce_sum(y_ * tf.log(y + 1e-5), reduction_indices=[1])
于 2016-08-01T12:42:31.853 回答