python - 使用 Tensorflow 计算 MNIST 图像的熵

标签 python tensorflow entropy mnist

我想测量 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/

相关文章:

computer-science - 一串英文文本的熵如何表示低质量?

java - 用于表示决策树归纳的数据结构

python - Pandas.to_datetime() 仅在数据框中的列上失败

python - 消除Cython numpy编译警告的方法?

python - 从 Keras 调用方法 timeseries_dataset_from_array 时出错

python - 关于 tensorflow 中的几个变量计算粗麻布

python - 没有 “global” 关键字的每个工作人员的永久对象池

python - Pycaret - 卡在设置上()

python-3.x - 无法使用经过训练的 Tensorflow 模型

python - pandas 将函数应用于多个列并创建多个列来存储结果