您好,登錄后才能下訂單哦!
BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
在圖片多標(biāo)簽分類時(shí),如果3張圖片分3類,會(huì)輸出一個(gè)3*3的矩陣。
先用Sigmoid給這些值都搞到0~1之間:
假設(shè)Target是:
下面我們用BCELoss來(lái)驗(yàn)證一下Loss是不是0.7194!
emmm應(yīng)該是我上面每次都保留4位小數(shù),算到最后誤差越來(lái)越大差了0.0001。不過(guò)也很厲害啦哈哈哈哈哈!
BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步。我們直接用剛剛的input驗(yàn)證一下是不是0.7193:
嘻嘻,我可真是太厲害啦!
補(bǔ)充:Pytorch中BCELoss,BCEWithLogitsLoss和CrossEntropyLoss的區(qū)別
當(dāng)網(wǎng)絡(luò)最后一層使用nn.Sigmoid時(shí),就用BCELoss,當(dāng)網(wǎng)絡(luò)最后一層不使用nn.Sigmoid時(shí),就用BCEWithLogitsLoss。
用于單標(biāo)簽二分類或者多標(biāo)簽二分類,輸出和目標(biāo)的維度是(batch,C),batch是樣本數(shù)量,C是類別數(shù)量,對(duì)于每一個(gè)batch的C個(gè)值,對(duì)每個(gè)值求sigmoid到0-1之間,所以每個(gè)batch的C個(gè)值之間是沒(méi)有關(guān)系的,相互獨(dú)立的,所以之和不一定為1。
每個(gè)C值代表屬于一類標(biāo)簽的概率。如果是單標(biāo)簽二分類,那輸出和目標(biāo)的維度是(batch,1)即可。
輸出和目標(biāo)的維度是(batch,C),batch是樣本數(shù)量,C是類別數(shù)量,每一個(gè)C之間是互斥的,相互關(guān)聯(lián)的,對(duì)于每一個(gè)batch的C個(gè)值,一起求每個(gè)C的softmax,所以每個(gè)batch的所有C個(gè)值之和是1,哪個(gè)值大,代表其屬于哪一類。如果用于二分類,那輸出和目標(biāo)的維度是(batch,2)。
補(bǔ)充:Pytorch踩坑記之交叉熵(nn.CrossEntropy,nn.NLLLoss,nn.BCELoss的區(qū)別和使用)
在Pytorch中的交叉熵函數(shù)的血淚史要從nn.CrossEntropyLoss()這個(gè)損失函數(shù)開(kāi)始講起。
從表面意義上看,這個(gè)函數(shù)好像是普通的交叉熵函數(shù),但是如果你看過(guò)一些Pytorch的資料,會(huì)告訴你這個(gè)函數(shù)其實(shí)是softmax()和交叉熵的結(jié)合體。
然而如果去官方看這個(gè)函數(shù)的定義你會(huì)發(fā)現(xiàn)是這樣子的:
哇,竟然是nn.LogSoftmax()和nn.NLLLoss()的結(jié)合體,這倆都是什么玩意兒啊。再看看你會(huì)發(fā)現(xiàn)甚至還有一個(gè)損失叫nn.Softmax()以及一個(gè)叫nn.nn.BCELoss()。我們來(lái)探究下這幾個(gè)損失到底有何種關(guān)系。
首先nn.Softmax()官網(wǎng)的定義是這樣的:
嗯...就是我們認(rèn)識(shí)的那個(gè)softmax。那nn.LogSoftmax()的定義也很直觀了:
果不其然就是Softmax取了個(gè)log??梢詫?xiě)個(gè)代碼測(cè)試一下:
import torch import torch.nn as nn a = torch.Tensor([1,2,3]) #定義Softmax softmax = nn.Softmax() sm_a = softmax=nn.Softmax() print(sm) #輸出:tensor([0.0900, 0.2447, 0.6652]) #定義LogSoftmax logsoftmax = nn.LogSoftmax() lsm_a = logsoftmax(a) print(lsm_a) #輸出tensor([-2.4076, -1.4076, -0.4076]),其中l(wèi)n(0.0900)=-2.4076
上面說(shuō)過(guò)nn.CrossEntropy()是nn.LogSoftmax()和nn.NLLLoss的結(jié)合,nn.NLLLoss官網(wǎng)給的定義是這樣的:
The negative log likelihood loss. It is useful to train a classification problem with C classes
負(fù)對(duì)數(shù)似然損失 ,看起來(lái)好像有點(diǎn)晦澀難懂,寫(xiě)個(gè)代碼測(cè)試一下:
import torch import torch.nn a = torch.Tensor([[1,2,3]]) nll = nn.NLLLoss() target1 = torch.Tensor([0]).long() target2 = torch.Tensor([1]).long() target3 = torch.Tensor([2]).long() #測(cè)試 n1 = nll(a,target1) #輸出:tensor(-1.) n2 = nll(a,target2) #輸出:tensor(-2.) n3 = nll(a,target3) #輸出:tensor(-3.)
看起來(lái)nn.NLLLoss做的事情是取出a中對(duì)應(yīng)target位置的值并取負(fù)號(hào),比如target1=0,就取a中index=0位置上的值再取負(fù)號(hào)為-1,那這樣做有什么意義呢,要結(jié)合nn.CrossEntropy往下看。
看下官網(wǎng)給的nn.CrossEntropy()的表達(dá)式:
看起來(lái)應(yīng)該是softmax之后取了個(gè)對(duì)數(shù),寫(xiě)個(gè)簡(jiǎn)單代碼測(cè)試一下:
import torch import torch.nn as nn a = torch.Tensor([[1,2,3]]) target = torch.Tensor([2]).long() logsoftmax = nn.LogSoftmax() ce = nn.CrossEntropyLoss() nll = nn.NLLLoss() #測(cè)試CrossEntropyLoss cel = ce(a,target) print(cel) #輸出:tensor(0.4076) #測(cè)試LogSoftmax+NLLLoss lsm_a = logsoftmax(a) nll_lsm_a = nll(lsm_a,target) #輸出tensor(0.4076)
看來(lái)直接用nn.CrossEntropy和nn.LogSoftmax+nn.NLLLoss是一樣的結(jié)果。為什么這樣呢,回想下交叉熵的表達(dá)式:
其中y是label,x是prediction的結(jié)果,所以其實(shí)交叉熵?fù)p失就是負(fù)的target對(duì)應(yīng)位置的輸出結(jié)果x再取-log。這個(gè)計(jì)算過(guò)程剛好就是先LogSoftmax()再NLLLoss()。
------------------------------------
所以我認(rèn)為nn.CrossEntropyLoss其實(shí)應(yīng)該叫做softmaxloss更為合理一些,這樣就不會(huì)誤解了。
你以為這就完了嗎,其實(shí)并沒(méi)有。還有一類損失叫做BCELoss,寫(xiě)全了的話就是Binary Cross Entropy Loss,就是交叉熵應(yīng)用于二分類時(shí)候的特殊形式,一般都和sigmoid一起用,表達(dá)式就是二分類交叉熵:
直覺(jué)上和多酚類交叉熵的區(qū)別在于,不僅考慮了的樣本,也考慮了的樣本的損失。
1.PyTorch是相當(dāng)簡(jiǎn)潔且高效快速的框架;2.設(shè)計(jì)追求最少的封裝;3.設(shè)計(jì)符合人類思維,它讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法;4.與google的Tensorflow類似,F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開(kāi)發(fā)更新;5.PyTorch作者親自維護(hù)的論壇 供用戶交流和求教問(wèn)題6.入門簡(jiǎn)單
看完上述內(nèi)容,你們掌握BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。