2017-07-19 195 views
0

我正在實現一個UNet二進制分割,同時使用Sigmoid和BCELoss。問題在於,經過多次迭代後,網絡試圖預測每個像素的非常小的值,而對於某些區域,它應該預測接近於1的值(對於地面實況蒙版區域)。它是否給出了有關錯誤行爲的直覺?BCELoss二進制像素分割pytorch

此外,還有NLLLoss2d用於像素損失。目前,我只是無視這一點,我直接使用MSELoss()。我應該使用帶有Sigmoid激活層的NLLLoss2d嗎?

謝謝

回答

0

在我看來,就像你的乙狀結腸飽和激活圖。圖像未正確標準化或某些批量標準化圖層丟失。如果您有一個與其他圖像一起工作的實現,請檢查圖像加載器並確保它不會使像素值飽和。這通常發生在16位通道上。你能分享一些輸入圖像嗎?

PS對不起,評論答案。這是一個新帳戶,我不允許發表評論。

+0

感謝您的回覆。 好吧,我在我的網絡中使用了batchNormalization,而對於除了最後一個是Sigmoid以外的所有層都使用了RELU。準確地說,「飽和像素值」是什麼意思? – Saeed

+0

1.在這種情況下,檢查輸出激活圖對Sigmoid而言是不是太高或太低。有效範圍在±sqrt(3)之間。 2. RE:「飽和像素值」,pytorch中的PIL加載器將16位圖像的所有像素設置爲1。我會建議編寫一個小函數來打印像素值並將其用作lambda變換。在這個函數中,你將在第一個參數中獲得加載的圖像,以檢查是否加載了合適的值。 3.什麼是你的標準化參數? –

1

您可能想要使用torch.nn.BCEWithLogitsLoss(),替換乙狀結腸和BCELoss功能。

摘自docs告訴你爲什麼總是更好地使用這個損失函數的實現。

這種損失在一個單獨的類中組合了一個Sigmoid層和BCELoss。這個版本在數值上比使用簡單的Sigmoid和BCELoss更穩定,因爲通過將操作組合到一個層中,我們利用log-sum-exp技巧來獲得數值穩定性。