二元交叉熵(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!