2017-02-08 110 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