使用 Tensorflow 的 MNIST 图像的熵

Entropy of a MNIST image with Tensorflow

我想测量 MNIST 图像的熵。然而,大多数强度值为 0,并且 tf.log returns inf。我知道我可以简单地计算熵:

entropy = tf.reduce_mean(-tf.reduce_sum(X * tf.log(X), axis=1))

其中 X 是 MNIST 图像批次的占位符,定义为 X = tf.placeholder("float", [None, 784])。然而,结果是nan(很多像素值都是0,所以tf.log会得到inf)。有没有办法解决这个问题,或者有其他方法来计算一张图像的熵?

熵取决于每个强度值的概率,而不是值本身。概率为 0 的值不进入计算。

编写代码计算照片中出现的每个强度值的比例。 这些 构成了你的 X 向量。


我认为你误解了熵的概念。可以查that part,还有计算

一般来说,它是您对分布的任何一个传输采样获得的平均惊喜量。另一种解释它的方法是在给定频率分布(霍夫曼代码)的情况下设计最佳二进制编码。传输的平均比特数就是熵。

现在,回到你的案例。为了简化数字,让我们考虑一个 10x10 图像,只有四个强度级别,0-3。 70 个值是 0,20 个是 1,还有六个 2 和四个 3 填满了这个集合。在这种情况下,上面的 X 数组只有四个值:[0.70, 0.20, 0.06, 0.04]。没有零值或负值会影响您的日志计算。

要手动执行此操作,让我们考虑一下霍夫曼编码。 simple-minded 情况是用 2 位二进制等价物对每个值进行编码:00、01、10、11。这为我们提供了每个传输值 2 位的固定速率。

不过,我们可以做得更好。如果我们将它们编码为

0: 0
1: 10
2: 110
3: 111

那么我们传输的平均比特数是:

0.70*1 + 0.20*2 + 0.06*3 + 0.04*3
= 0.70 + 0.40 + 0.18 + 0.12
= 1.40 bits

...所以 1.40 是此图像的熵。请注意,我们没有记录任何 values,仅记录 frequencies.