2017-08-27 132 views
0

我正試圖在兩幅圖像之間實現交叉熵損失。我的訓練和輸入圖像都在0-1範圍內。現在,我正試圖僅爲一類圖像實現這一點。說明說我有不同的橙色圖片,但只有橙色的圖片。我已經構建了我的模型,並實現了交叉熵損失函數。在張量流中實現兩張圖像之間的交叉熵損失

def loss_func_entropy(logits,y): 
    logits=tf.reshape(logits,[BATCH_SIZE*480*640,1]) 
    y=tf.reshape(y,[BATCH_SIZE*480*640,1]) 
    print (logits.get_shape(),y.get_shape()) 
    return tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=y,dim=0)) 

顯然我沒有這樣做是正確的,因爲我的損失函數不斷增加。值得注意的是,logits和y都是2D的。我將它們重新塑造成一個單獨的矢量,並嘗試做交叉熵。

+0

你是什麼意思「在範圍內」0,1?間隔是整數間隔還是實際間隔? –

+0

圖像的類型爲float,最大值爲1,最小值爲0. –

回答

2

首先,重塑實際上應該是(它將不運行它也爲這個特殊的問題,但也算不上什麼TF希望看到作爲模型的輸出):

logits=tf.reshape(logits,[BATCH_SIZE,480*640]) 
y=tf.reshape(y,[BATCH_SIZE,480*640]) 

然後唯一的錯誤在於TF has a "jungle" of cross-entropy functions。您正在尋找的是sigmoid_cross_entropy_with_logits,而不是softmax之一。你使用的那個標準化整個圖像,所以像素之和是1(顯然不是真的)。你想要的是將每個像素作爲一個單獨的「軟分類」問題,其中規範化的強度被認爲是一個概率,這正是sigmoid_cross_entropy_with_logits所做的。換句話說 - 這只是一個帶軟目標的多標籤分類。

特別是,與以前的重塑,softmax_cross_entropy_with_logits會表現得更加奇怪 - 因爲你有一個輸出,但仍然適用SOFTMAX,它應該永遠產生輸出「1」,作爲一個 X:

softmax(x) = exp(x)/SUM exp(x) = 1 
+0

謝謝。我現在能夠獲得遞減的損失函數。請你詳細說明爲什麼我應該選擇S形交叉熵。如果你能指出理論背後的任何資源,它將是有用的。 –

+0

我在關於交叉熵叢林的鏈接文章中闡述了很多。這只是關於具有單獨幫助功能的設置中的細微差異。對於你的情況,這可以歸結爲這裏描述的內容 - 當目標總和爲1(在你的情況 - 所有像素在一起)時,softmax_ *被使用,而sigmoid_ *當目標的每個維度**在[0,1 ](所以**每**像素獨立)。 – lejlot

+0

有道理。萬分感謝! –