2017-03-01 210 views
5

我在計算張量流中的交叉熵方面很困難。特別是,我使用的功能:在張量流中計算交叉熵

tf.nn.softmax_cross_entropy_with_logits() 

使用的是看似簡單的代碼,我只能得到它返回一個零

import tensorflow as tf 
import numpy as np 

sess = tf.InteractiveSession() 

a = tf.placeholder(tf.float32, shape =[None, 1]) 
b = tf.placeholder(tf.float32, shape = [None, 1]) 
sess.run(tf.global_variables_initializer()) 
c = tf.nn.softmax_cross_entropy_with_logits(
    logits=b, labels=a 
).eval(feed_dict={b:np.array([[0.45]]), a:np.array([[0.2]])}) 
print c 

回報

0 

我的理解交叉熵如下:

H(p,q) = p(x)*log(q(x)) 

其中p(x)是事件x的真實概率,q(x)是事件x的預測概率。

如果有輸入的任何兩個數值爲P(X)和q(x)的使用,使得

0<p(x)<1 AND 0<q(x)<1 

應該有一個非零交叉熵。我期待着我正在使用張量流。預先感謝您的幫助。

+0

於是,有趣的是我得到了使用交叉熵從這個項目的想法: https://github.com/carpedm20/DCGAN-tensorflow/blob/master/model.py他們正在使用它 到確定樣本是否來自實際分佈。然而,似乎二元softmax迴歸與邏輯迴歸相同。 –

回答

7

就像他們說的,你不能在沒有「softmax」的情況下拼寫「softmax_cross_entropy_with_logits」。 [0.45]的Softmax是[1],並且log(1)0

措施的概率誤差離散分類任務,其中 類是互斥的(每個條目是在恰好一個類)。對於 示例,每個CIFAR-10圖像都標有一個且僅有一個標籤:圖像 可以是狗或卡車,但不能同時爲兩個。

注意:儘管類是互斥的,但它們的概率 不一定是。所有需要的是labels的每一行是 有效的概率分佈。如果它們不是,那麼梯度的計算將是不正確的。

如果使用專有labels(其中一個且只有一個 一次爲真),請參閱sparse_softmax_cross_entropy_with_logits

警告:該運預計未縮放logits,因爲它提高效率上執行logits一個softmax 內部。不要用 輸出softmax調用此操作,因爲它會產生不正確的結果。

logitslabels必須具有相同的形狀[batch_size, num_classes] 和相同的D型細胞(無論是float16float32,或float64)。

+0

啊哈!所以看來我的問題是由於對softmax的誤解造成的!感謝您的幫助! –

+0

@DavidKaftan,如果這可以解決您的問題,將其標記爲可接受的答案將是很好的。 :) –

+1

謝謝!我很明顯是新來的! –

7

除了唐的回答(+1),this answer written by mrry您可能會感興趣,因爲它給人的公式來計算TensorFlow交叉熵:

的另一種方式寫:

xent = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 

...應該是:

softmax = tf.nn.softmax(logits) 
xent = -tf.reduce_sum(labels * tf.log(softmax), 1) 

然而,這竟被替代d是(ⅰ)以下數值穩定(因爲 的SOFTMAX可以計算大得多的值)和(ii)低效率 (因爲一些冗餘計算將在backprop發生)。對於 的實際用途,我們建議您使用 tf.nn.softmax_cross_entropy_with_logits()

+2

感謝您使用(no-softmax)交叉熵公式 – alanwsx