我想测量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 :(得分:2)
熵取决于每个强度值的概率,而不取决于值本身。概率为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,1。这使得每个传输值的平均速率为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是该图像的熵。请注意,我们没有记录任何值的日志,只记录了频率。