2017-07-20 70 views
1

我使用完全卷積神經網絡(鏈接到紙)做圖像分割:https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdfTensorflow:加權稀疏SOFTMAX與交叉熵損失

這可以被認爲是像素分類(用於最終的每個像素獲得一個標籤)

我正在使用tf.nn.sparse_softmax_cross_entropy_with_logits丟失函數。

loss = tf.reduce_mean((tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, 
                     labels=tf.squeeze(annotation, squeeze_dims=[3]), 
                     name="entropy"))) 

一切都很順利。然而,我看到在絕大多數像素(95%以上)中出現了一類,稱爲這個類別0.假設我們有另外三個類別,1,2和3.

什麼是最簡單的方法把重量放在類上?從本質上講,我想相比於其他三類誰應該有正常體重1

我知道這個功能的存在是爲了對0類(如0.1),重量很輕:https://www.tensorflow.org/api_docs/python/tf/losses/sparse_softmax_cross_entropy

它只是看起來我認爲它做了完全不同的事情,我不明白權重應該如何與標籤具有相同的級別。我的意思是,在我的情況下,權重應該像Tensor([0.1,1,1,1])形狀(4,)和等級1,而標籤具有形狀(batch_size,width,height)和等級3。我錯過了什麼嗎?

上PyTorch等效將是

torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100) 

其中權重是炬張量[0.1,1,1,1]

謝謝!

+0

我認爲它主要是在[這個問題](https://stackoverflow.com/questions/44560549/unbalanced-data-and-weighted-cross-entropy/44563055),只是用交叉熵替換稀疏交叉熵。 – user1735003

回答

1

你的猜測是正確的,在tf.losses.softmax_cross_entropytf.losses.sparse_softmax_cross_entropyweights參數意味着整個一批,即權重做出一些輸入例子比其他人更重要。在中沒有現成的方法來減輕損失。

作爲一種解決方法,您可以做的是根據當前標籤專門挑選重量,並將它們用作批量權重。這意味着每個批次的權重矢量將會不同,但會嘗試使偶爾罕見的類更重要。請參閱this question中的示例代碼。

注意:由於批次不一定包含統一的類別分佈,因此這種方法對於小批量處理效果不佳,對於較大的批量處理效果會更好。批量大小爲1時,它完全沒用。因此,儘可能地使批次儘可能大。