欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pytorch BCELoss和BCEWithLogitsLoss的使用

 更新時(shí)間:2021年05月13日 10:40:21   作者:豪哥123  
這篇文章主要介紹了Pytorch BCELoss和BCEWithLogitsLoss的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

BCELoss

在圖片多標(biāo)簽分類時(shí),如果3張圖片分3類,會(huì)輸出一個(gè)3*3的矩陣。

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

假設(shè)Target是:

下面我們用BCELoss來驗(yàn)證一下Loss是不是0.7194!

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

BCEWithLogitsLoss

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

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

補(bǔ)充:Pytorch中BCELoss,BCEWithLogitsLoss和CrossEntropyLoss的區(qū)別

BCEWithLogitsLoss = Sigmoid+BCELoss

當(dāng)網(wǎng)絡(luò)最后一層使用nn.Sigmoid時(shí),就用BCELoss,當(dāng)網(wǎng)絡(luò)最后一層不使用nn.Sigmoid時(shí),就用BCEWithLogitsLoss。

(BCELoss)BCEWithLogitsLoss

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

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

CrossEntropyLoss用于多類別分類

輸出和目標(biāo)的維度是(batch,C),batch是樣本數(shù)量,C是類別數(shù)量,每一個(gè)C之間是互斥的,相互關(guān)聯(lián)的,對于每一個(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ù)開始講起。

從表面意義上看,這個(gè)函數(shù)好像是普通的交叉熵函數(shù),但是如果你看過一些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()。我們來探究下這幾個(gè)損失到底有何種關(guān)系。

nn.Softmax和nn.LogSoftmax

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

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

果不其然就是Softmax取了個(gè)log??梢詫憘€(gè)代碼測試一下:

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

nn.NLLLoss

上面說過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ù)對數(shù)似然損失 ,看起來好像有點(diǎn)晦澀難懂,寫個(gè)代碼測試一下:

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中對應(yīng)target位置的值并取負(fù)號(hào),比如target1=0,就取a中index=0位置上的值再取負(fù)號(hào)為-1,那這樣做有什么意義呢,要結(jié)合nn.CrossEntropy往下看。

nn.CrossEntropy

看下官網(wǎng)給的nn.CrossEntropy()的表達(dá)式:

看起來應(yīng)該是softmax之后取了個(gè)對數(shù),寫個(gè)簡單代碼測試一下:

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是一樣的結(jié)果。為什么這樣呢,回想下交叉熵的表達(dá)式:

l(x,y)=-\sum y*logx=\left\{\begin{matrix} -logx , y=1& \\ 0,y=0& \end{matrix}\right.

其中y是label,x是prediction的結(jié)果,所以其實(shí)交叉熵?fù)p失就是負(fù)的target對應(yīng)位置的輸出結(jié)果x再取-log。這個(gè)計(jì)算過程剛好就是先LogSoftmax()再NLLLoss()。

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

所以我認(rèn)為nn.CrossEntropyLoss其實(shí)應(yīng)該叫做softmaxloss更為合理一些,這樣就不會(huì)誤解了。

nn.BCELoss

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

直覺上和多酚類交叉熵的區(qū)別在于,不僅考慮了y_n=1的樣本,也考慮了y_n=0的樣本的損失。

總結(jié)

nn.LogSoftmax是在softmax的基礎(chǔ)上取自然對數(shù)nn.NLLLoss是負(fù)的似然對數(shù)損失,但Pytorch的實(shí)現(xiàn)就是把對應(yīng)target上的數(shù)取出來再加個(gè)負(fù)號(hào),要在CrossEntropy中結(jié)合LogSoftmax來用BCELoss是二分類的交叉熵?fù)p失,Pytorch實(shí)現(xiàn)中和多分類有區(qū)別

Pytorch是個(gè)深坑,讓我們一起扎根使用手冊,結(jié)合實(shí)踐踏平這些坑吧暴風(fēng)哭泣。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中使用不同編碼讀寫txt文件詳解

    Python中使用不同編碼讀寫txt文件詳解

    這篇文章主要介紹了Python中使用不同編碼讀寫txt文件詳解,本文給出不同編碼下的讀寫文件代碼方法,需要的朋友可以參考下
    2015-05-05
  • python自動(dòng)填寫問卷星問卷以及提交問卷等功能

    python自動(dòng)填寫問卷星問卷以及提交問卷等功能

    這篇文章主要給大家介紹了關(guān)于python自動(dòng)填寫問卷星問卷以及提交問卷等功能的相關(guān)資料,包括使用Selenium庫模擬瀏覽器操作、定位元素、填寫表單等,通過本文的學(xué)習(xí),讀者可以了解如何利用Python自動(dòng)化技術(shù)提高問卷填寫效率,需要的朋友可以參考下
    2023-03-03
  • 詳解Pandas之容易讓人混淆的行選擇和列選擇

    詳解Pandas之容易讓人混淆的行選擇和列選擇

    這篇文章主要介紹了詳解Pandas之容易讓人混淆的行選擇和列選擇,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例

    Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)監(jiān)控Nginx配置文件的不同并發(fā)送郵件報(bào)警功能,涉及Python基于difflib模塊的文件比較及smtplib模塊的郵件發(fā)送相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    pygame實(shí)現(xiàn)貪吃蛇游戲(上)

    這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • IPython庫中的display函數(shù)的簡介、使用方法、應(yīng)用案例詳細(xì)攻略

    IPython庫中的display函數(shù)的簡介、使用方法、應(yīng)用案例詳細(xì)攻略

    display 函數(shù)可以接受一個(gè)或多個(gè)參數(shù),每個(gè)參數(shù)都是一個(gè) Python 對象。它會(huì)自動(dòng)根據(jù)對象的類型選擇合適的顯示方式,并在 Jupyter Notebook 中顯示出來,這篇文章主要介紹了IPython庫中的display函數(shù)的簡介、使用方法、應(yīng)用案例詳細(xì)攻略,需要的朋友可以參考下
    2023-04-04
  • python內(nèi)建類型與標(biāo)準(zhǔn)類型

    python內(nèi)建類型與標(biāo)準(zhǔn)類型

    這篇文章主要介紹了python內(nèi)建類型與標(biāo)準(zhǔn)類型,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Python3+Flask安裝使用教程詳解

    Python3+Flask安裝使用教程詳解

    這篇文章主要介紹了Python3+Flask安裝使用教程詳解,需要的朋友可以參考下
    2021-02-02
  • Python中的Decimal使用及說明

    Python中的Decimal使用及說明

    這篇文章主要介紹了Python中的Decimal使用及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 合并Excel工作薄中成績表的VBA代碼,非常適合教育一線的朋友

    合并Excel工作薄中成績表的VBA代碼,非常適合教育一線的朋友

    每次學(xué)生考試,評分完畢之后,把每個(gè)科的成績收集起來,就得到了一個(gè)有若干工作表,每個(gè)表有學(xué)生學(xué)號(hào)、分?jǐn)?shù)等列的Excel工作薄。
    2009-04-04

最新評論