tensorflow分类的loss函数_Tensorflow入门教程(三十三)——图像分割损失函数FocalLoss...
常見的圖像分割損失函數有交叉熵,dice系數,FocalLoss等。今天我將分享圖像分割FocalLoss損失函數及Tensorflow版本的復現。
1、FocalLoss介紹
FocalLoss思想出自何凱明大神的論文《Focal Loss for Dense Object Detection》,主要是為了解決one-stage目標檢測中正負樣本比例嚴重失衡的問題。
FocalLoss是在交叉熵函數的基礎上進行的改進,改進的地方主要在兩個地方
(1)、改進第一點如下公式所示。
首先在原有交叉熵函數基礎上加了一個權重因子,其中gamma>0,使得更關注于困難的、錯分的樣本。比如:若 gamma = 2,對于正類樣本來說,如果預測結果為0.97,那么肯定是易分類的樣本,權重值為0.0009,損失函數值就會很小了;對于正類樣本來說,如果預測結果為0.3,那么肯定是難分類的樣本,權重值為0.49,其損失函數值相對就會很大;對于負類樣本來說,如果預測結果為0.8,那么肯定是難分類的樣本,權重值為0.64,其損失函數值相對就會很大;對于負類樣本來說,如果預測結果為0.1,那么肯定是易分類的樣本,權重值為0.01,其損失函數值就會很小。而對于預測概率為0.5時,損失函數值只減少了0.25倍,所以FocalLoss減少了簡單樣本的影響從而更加關注于難以區分的樣本。
(2)、改進第二點如下公式所示。
FocalLoss還引入了平衡因子alpha,用來平衡正負樣本本身的比例不均勻。alpha取值范圍0~1,當alpha>0.5時,可以相對增加y=1所占的比例,保證正負樣本的平衡。
(3)、雖然在何凱明的試驗中,?認為gamma為2是最優的,但是不代表這個參數適合其他樣本,在實際應用中還需要根據實際情況調整這兩個參數:alpha和gamma。
2、FocalLoss公式推導
在github上已經可以找到很多FocalLoss的實現,如下二分類的FocalLoss實現。實現其實不是很難,但是在實際訓練時會出現NAN的現象。
下面將簡單推導一下FocalLoss函數在二分類時的函數表達式。
FocalLoss函數可以表示如下公式所示:
假設網絡的最后輸出采用邏輯回歸函數sigmod,對于二分類問題(0和1),預測輸出可以表示為:
將上述公式帶入FocalLoss函數中,并進行推導。
3、FocalLoss代碼實現
按照上面導出的表達式FocalLoss的偽代碼可以表示為:
其中,
從這里可以看到1-y_pred項可能為0或1,這會導致log函數值出現NAN現象,所以好需要對y_pred項進行固定范圍值的截斷操作。最后在TensorFlow1.8下實現了該函數。
import?tensorflow?as?tfdef focal_loss(y_true, y_pred, alpha=0.25, gamma=2): epsilon = 1e-5 y_pred = tf.clip_by_value(y_pred, epsilon, 1 - epsilon) logits = tf.log(y_pred / (1 - y_pred)) weight_a = alpha * tf.pow((1 - y_pred), gamma) * y_true weight_b = (1 - alpha) * tf.pow(y_pred, gamma) * (1 - y_true) loss = tf.log1p(tf.exp(-logits)) * (weight_a + weight_b) + logits * weight_b????return?tf.reduce_mean(loss)總結
以上是生活随笔為你收集整理的tensorflow分类的loss函数_Tensorflow入门教程(三十三)——图像分割损失函数FocalLoss...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在浙江买房子两室一厅多少钱?
- 下一篇: 铺设实木地板谨防四问题