2017-02-08 83 views
0

我想测量MNIST图像的熵。然而,大部分强度值为0,并且tf.log返回inf。我知道我可以简单地计算熵:使用Tensorflow的MNIST图像的熵

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)。有没有办法解决这个问题,或另一种方法来计算一个图像的熵?

回答

1

熵取决于每个强度值的概率,而不是值本身。概率为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是这一形象的熵。请注意,我们没有取中的任何一个的日志,仅仅是的频率

+0

你的意思是规范化的价值,使所有784他们加起来1? – user3813674

+0

如果你有0 1,该怎么办? 90 0,6 2和4。不会有零吗?那么我怎么过滤掉所有的0呢? – user3813674

+0

不,因为你在计算中不包含0。没有1可以预测 - 它们不在可用输出集合中。你也不包括3,7,1024's,狗,脑肿瘤或小神。如果它不在人口中,它对熵没有影响。 – Prune