【问题标题】:Entropy of a MNIST image with Tensorflow使用 Tensorflow 的 MNIST 图像的熵
【发布时间】:2017-02-09 06:13:47
【问题描述】:

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

【问题讨论】:

    标签: python tensorflow entropy mnist


    【解决方案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 是这张图片的熵。请注意,我们没有记录任何,只记录频率

    【讨论】:

    • 你的意思是标准化这些值,使所有 784 个值加起来为 1?
    • 如果你有 0 个 1 怎么办。 90 个 0、6 个 2 和 4。不会有零吗?那我该如何过滤掉所有的0呢?
    • 不,因为您确实在计算中包含该 0。没有 1 可以预测——它们不在可用输出集中。您也不包括 3、7、1024、狗、脑瘤或小神。如果不在总体中,则对熵没有影响。
    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多