一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Pytorch BCELoss和BCEWithLogitsLoss的使用

Pytorch BCELoss和BCEWithLogitsLoss的使用

2021-10-29 10:00豪哥123 Python

這篇文章主要介紹了Pytorch BCELoss和BCEWithLogitsLoss的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

BCELoss

在圖片多標簽分類時,如果3張圖片分3類,會輸出一個3*3的矩陣。

Pytorch BCELoss和BCEWithLogitsLoss的使用

先用Sigmoid給這些值都搞到0~1之間:

Pytorch BCELoss和BCEWithLogitsLoss的使用

假設Target是:

Pytorch BCELoss和BCEWithLogitsLoss的使用

Pytorch BCELoss和BCEWithLogitsLoss的使用

下面我們用BCELoss來驗證一下Loss是不是0.7194!

Pytorch BCELoss和BCEWithLogitsLoss的使用

emmm應該是我上面每次都保留4位小數,算到最后誤差越來越大差了0.0001。不過也很厲害啦哈哈哈哈哈!

BCEWithLogitsLoss

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步。我們直接用剛剛的input驗證一下是不是0.7193:

Pytorch BCELoss和BCEWithLogitsLoss的使用

嘻嘻,我可真是太厲害啦!

補充:Pytorch中BCELoss,BCEWithLogitsLoss和CrossEntropyLoss的區別

BCEWithLogitsLoss = Sigmoid+BCELoss

當網絡最后一層使用nn.Sigmoid時,就用BCELoss,當網絡最后一層不使用nn.Sigmoid時,就用BCEWithLogitsLoss。

(BCELoss)BCEWithLogitsLoss

用于單標簽二分類或者多標簽二分類,輸出和目標的維度是(batch,C),batch是樣本數量,C是類別數量,對于每一個batch的C個值,對每個值求sigmoid到0-1之間,所以每個batch的C個值之間是沒有關系的,相互獨立的,所以之和不一定為1。

每個C值代表屬于一類標簽的概率。如果是單標簽二分類,那輸出和目標的維度是(batch,1)即可。

CrossEntropyLoss用于多類別分類

輸出和目標的維度是(batch,C),batch是樣本數量,C是類別數量,每一個C之間是互斥的,相互關聯的,對于每一個batch的C個值,一起求每個C的softmax,所以每個batch的所有C個值之和是1,哪個值大,代表其屬于哪一類。如果用于二分類,那輸出和目標的維度是(batch,2)。

補充:Pytorch踩坑記之交叉熵(nn.CrossEntropy,nn.NLLLoss,nn.BCELoss的區別和使用)

在Pytorch中的交叉熵函數的血淚史要從nn.CrossEntropyLoss()這個損失函數開始講起。

從表面意義上看,這個函數好像是普通的交叉熵函數,但是如果你看過一些Pytorch的資料,會告訴你這個函數其實是softmax()和交叉熵的結合體。

然而如果去官方看這個函數的定義你會發現是這樣子的:

Pytorch BCELoss和BCEWithLogitsLoss的使用

哇,竟然是nn.LogSoftmax()和nn.NLLLoss()的結合體,這倆都是什么玩意兒啊。再看看你會發現甚至還有一個損失叫nn.Softmax()以及一個叫nn.nn.BCELoss()。我們來探究下這幾個損失到底有何種關系。

nn.Softmax和nn.LogSoftmax

首先nn.Softmax()官網的定義是這樣的:

Pytorch BCELoss和BCEWithLogitsLoss的使用

嗯...就是我們認識的那個softmax。那nn.LogSoftmax()的定義也很直觀了:

Pytorch BCELoss和BCEWithLogitsLoss的使用

果不其然就是Softmax取了個log。可以寫個代碼測試一下:

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]),其中ln(0.0900)=-2.4076

nn.NLLLoss

上面說過nn.CrossEntropy()是nn.LogSoftmax()和nn.NLLLoss的結合,nn.NLLLoss官網給的定義是這樣的:

The negative log likelihood loss. It is useful to train a classification problem with C classes

Pytorch BCELoss和BCEWithLogitsLoss的使用

負對數似然損失 ,看起來好像有點晦澀難懂,寫個代碼測試一下:

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()
 
#測試
n1 = nll(a,target1)
#輸出:tensor(-1.)
n2 = nll(a,target2)
#輸出:tensor(-2.)
n3 = nll(a,target3)
#輸出:tensor(-3.)

看起來nn.NLLLoss做的事情是取出a中對應target位置的值并取負號,比如target1=0,就取a中index=0位置上的值再取負號為-1,那這樣做有什么意義呢,要結合nn.CrossEntropy往下看。

nn.CrossEntropy

看下官網給的nn.CrossEntropy()的表達式:

Pytorch BCELoss和BCEWithLogitsLoss的使用

看起來應該是softmax之后取了個對數,寫個簡單代碼測試一下:

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()
 
#測試CrossEntropyLoss
cel = ce(a,target)
print(cel)
#輸出:tensor(0.4076)
 
#測試LogSoftmax+NLLLoss
lsm_a = logsoftmax(a)
nll_lsm_a = nll(lsm_a,target)
#輸出tensor(0.4076)

看來直接用nn.CrossEntropy和nn.LogSoftmax+nn.NLLLoss是一樣的結果。為什么這樣呢,回想下交叉熵的表達式:

Pytorch BCELoss和BCEWithLogitsLoss的使用

其中y是label,x是prediction的結果,所以其實交叉熵損失就是負的target對應位置的輸出結果x再取-log。這個計算過程剛好就是先LogSoftmax()再NLLLoss()。

------------------------------------

所以我認為nn.CrossEntropyLoss其實應該叫做softmaxloss更為合理一些,這樣就不會誤解了。

nn.BCELoss

你以為這就完了嗎,其實并沒有。還有一類損失叫做BCELoss,寫全了的話就是Binary Cross Entropy Loss,就是交叉熵應用于二分類時候的特殊形式,一般都和sigmoid一起用,表達式就是二分類交叉熵:

Pytorch BCELoss和BCEWithLogitsLoss的使用

直覺上和多酚類交叉熵的區別在于,不僅考慮了Pytorch BCELoss和BCEWithLogitsLoss的使用的樣本,也考慮了Pytorch BCELoss和BCEWithLogitsLoss的使用的樣本的損失。

總結

nn.LogSoftmax是在softmax的基礎上取自然對數nn.NLLLoss是負的似然對數損失,但Pytorch的實現就是把對應target上的數取出來再加個負號,要在CrossEntropy中結合LogSoftmax來用BCELoss是二分類的交叉熵損失,Pytorch實現中和多分類有區別

Pytorch是個深坑,讓我們一起扎根使用手冊,結合實踐踏平這些坑吧暴風哭泣

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_22210253/article/details/85222093

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我要色色网| 国产精品夜夜爽张柏芝 | 国产绳艺在线播放 | 久久伊人精品青青草原2021 | 色狠狠成人综合网 | 996热精品视频在线观看 | 国产一二三区视频 | 天天操天天干天天 | 欧美一级视频在线观看 | 隔壁老王国产在线精品 | 天堂欧美 | 亚洲+欧美+国产+综合 | 国产成人8x视频一区二区 | 欧美日韩国产亚洲一区二区 | 操美女| 国产在线麻豆波多野结衣 | 欧美猛男同志video在线 | 出轨同学会2在线观看 | 亚洲精品丝袜在线一区波多野结衣 | 国产欧美国产综合第一区 | 欧美一卡二卡科技有限公司 | 91啪在线观看国产在线 | 97色蜜桃 | 天天爽视频 | 日韩 视频在线播放 | 日本妻子迷妹网 | 久久久免费观成人影院 | 小草观看免费高清视频 | 国产情侣偷国语对白 | 四虎影视网址 | 无限资源在线观看播放 | 欧美成人aaaa免费高清 | 女色在线观看免费视频 | 欧美精品一区二区三区免费 | 日本久久免费大片 | 国产精品成人一区二区1 | 王雨纯 羞羞 | 男人使劲躁女人小视频 | 91茄子| 亚洲国产日韩欧美mv | www.com在线观看 |