我想测量 MNIST 图像的熵。然而,大多数强度值为 0,并且 tf.log
返回 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,还有 6 个 2 和 4 个 3 填充了该集合。在这种情况下,上面的 X 数组只有四个值:[0.70, 0.20, 0.06, 0.04]。没有零或负值会干扰您的日志计算。
为了手动完成此操作,让我们考虑霍夫曼编码。简单的情况是用 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 是该图像的熵。请注意,我们没有获取任何值的对数,仅获取频率的对数。
关于python - 使用 Tensorflow 计算 MNIST 图像的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42121596/