我想测量 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,还有六个 2 和四个 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 是此图像的熵。请注意,我们没有记录任何值,仅记录频率。
