F.binary_cross_entropy_with_logits函式與F.binary_cross_entropy函式的關係(二分類問題)

BooTurbo發表於2023-04-25

 

 

 

 二元交叉熵(Binary cross entropy)是二分類中常用的損失函式,它可以衡量兩個機率分佈的距離,二元交叉熵越小,分佈越相似,其公式如下:

我們用jupyter notebook舉例解釋一下,

假設 1個影像樣本由神經網路處理後的輸出是 size 10×4 的tensor,隨機生成一個tensor,

使用Sigmoid對該tensor進行機率變換,tensor的每個數值的變換都是相互獨立的,下面得出預測的機率分佈,

我們在這裡隨機生成一個真值的機率分佈y,

自己定義一下BCELoss,需要輸入預測的機率分佈和真值的機率分佈,BCELoss對每一對機率值(probm,n,ym,n)單獨計算交叉熵,然後求和,再求平均,

手動計算一下,結果一致,

使用F.binary_cross_entropy 驗證一下,同樣需要輸入預測的機率分佈和真值的機率分佈,

再使用F.binary_cross_entropy_with_logits驗證一下,直接輸入神經網路的輸出和真值的機率分佈,

相比F.binary_cross_entropy函式,F.binary_cross_entropy_with_logits函式在內部使用了sigmoid函式,也就是

F.binary_cross_entropy_with_logits = sigmoid + F.binary_cross_entropy。

實際使用時:

假設輸入神經網路的batch_size= 8,每個影像樣本經過處理後的輸出是 size = 10×4 的tensor,每個 tensor 被看作 40 個樣本點的集合,那麼 8個影像樣本得到 320個樣本點,

F.binary_cross_entropy_with_logits函式和 F.binary_cross_entropy函式的 reduction 引數都預設是‘mean’模式,直接使用預設值的話,結果是320個樣本點的二元交叉熵的平均值,

若要計算8個影像樣本的二元交叉熵的平均值,可以設定 reduction=‘sum’ , 這樣能得到 320個樣本點的二元交叉熵的和,然後除以batch_size 就能得到8個影像樣本的二元交叉熵的平均值,

loss = F.binary_cross_entropy_with_logits(predict, y, weight, reduction='sum') / batch_size

這裡的predict 和 y都是 8×10×4 的shape。

 

BCELoss與BCEWithLogitsLoss的關聯:BCEWithLogitsLoss = Sigmoid + BCELoss,

 

 

 

Enjoy it!

 

相關文章