Pytorch損失函數(shù)torch.nn.NLLLoss()的使用
Pytorch損失函數(shù)torch.nn.NLLLoss()
在各種深度學(xué)習(xí)框架中,我們最常用的損失函數(shù)就是交叉熵(torch.nn.CrossEntropyLoss),熵是用來(lái)描述一個(gè)系統(tǒng)的混亂程度,通過(guò)交叉熵我們就能夠確定預(yù)測(cè)數(shù)據(jù)與真是數(shù)據(jù)之間的相近程度。
交叉熵越小,表示數(shù)據(jù)越接近真實(shí)樣本。
交叉熵計(jì)算公式

就是我們預(yù)測(cè)的概率的對(duì)數(shù)與標(biāo)簽的乘積,當(dāng)qk->1的時(shí)候,它的損失接近零。
nn.NLLLoss
官方文檔中介紹稱(chēng):
nn.NLLLoss輸入是一個(gè)對(duì)數(shù)概率向量和一個(gè)目標(biāo)標(biāo)簽,它與nn.CrossEntropyLoss的關(guān)系可以描述為:softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss
CrossEntropyLoss()=log_softmax() + NLLLoss()
其中softmax函數(shù)又稱(chēng)為歸一化指數(shù)函數(shù),它可以把一個(gè)多維向量壓縮在(0,1)之間,并且它們的和為1.
計(jì)算公式
示例代碼:
import math z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0] z_exp = [math.exp(i) for i in z] print(z_exp) # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09] sum_z_exp = sum(z_exp) print(sum_z_exp) # Result: 114.98 softmax = [round(i / sum_z_exp, 3) for i in z_exp] print(softmax) # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]
log_softmax
log_softmax是指在softmax函數(shù)的基礎(chǔ)上,再進(jìn)行一次log運(yùn)算,此時(shí)結(jié)果有正有負(fù),log函數(shù)的值域是負(fù)無(wú)窮到正無(wú)窮,當(dāng)x在0—1之間的時(shí)候,log(x)值在負(fù)無(wú)窮到0之間。
nn.NLLLoss
此時(shí),nn.NLLLoss的結(jié)果就是把上面的輸出與Label對(duì)應(yīng)的那個(gè)值拿出來(lái),再去掉負(fù)號(hào),再求均值。
代碼示例:
import torch
input=torch.randn(3,3)
soft_input = torch.nn.Softmax(dim=0)
soft_input(input)
Out[20]:
tensor([[0.7284, 0.7364, 0.3343],
[0.1565, 0.0365, 0.0408],
[0.1150, 0.2270, 0.6250]])
#對(duì)softmax結(jié)果取log
torch.log(soft_input(input))
Out[21]:
tensor([[-0.3168, -0.3059, -1.0958],
[-1.8546, -3.3093, -3.1995],
[-2.1625, -1.4827, -0.4701]])
假設(shè)標(biāo)簽是[0,1,2],第一行取第0個(gè)元素,第二行取第1個(gè),第三行取第2個(gè),去掉負(fù)號(hào),即[0.3168,3.3093,0.4701],求平均值,就可以得到損失值。
(0.3168+3.3093+0.4701)/3 Out[22]: 1.3654000000000002 #驗(yàn)證一下 loss=torch.nn.NLLLoss() target=torch.tensor([0,1,2]) loss(input,target) Out[26]: tensor(0.1365)
nn.CrossEntropyLoss
loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
loss(input,target)
Out[26]: tensor(-0.1399)
loss =torch.nn.CrossEntropyLoss()
input = torch.tensor([[ 1.1879, 1.0780, 0.5312],
[-0.3499, -1.9253, -1.5725],
[-0.6578, -0.0987, 1.1570]])
target = torch.tensor([0,1,2])
loss(input,target)
Out[30]: tensor(0.1365)
以上為全部實(shí)驗(yàn)驗(yàn)證兩個(gè)loss函數(shù)之間的關(guān)系?。?!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python自動(dòng)化測(cè)試selenium指定截圖文件名方法
這篇文章主要介紹了Python自動(dòng)化測(cè)試selenium指定截圖文件名方法,Selenium?支持?Web?瀏覽器的自動(dòng)化,它提供一套測(cè)試函數(shù),用于支持?Web?自動(dòng)化測(cè)試,下文基于python實(shí)現(xiàn)指定截圖文件名方法,需要的小伙伴可以參考一下2022-05-05
Python實(shí)現(xiàn)多個(gè)視頻合成一個(gè)視頻的功能
這篇文章主要介紹了可以將多個(gè)視頻拼接為一個(gè)視頻的Python工具代碼,文中的代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,快來(lái)跟隨小編一起學(xué)習(xí)一下吧2021-12-12
Pytorch計(jì)算網(wǎng)絡(luò)參數(shù)的兩種方法
PyTorch是一個(gè)流行的深度學(xué)習(xí)框架,它允許研究人員和開(kāi)發(fā)者快速構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò),計(jì)算一個(gè)PyTorch網(wǎng)絡(luò)的參數(shù)量通常涉及兩個(gè)步驟,本文給大家介紹了在PyTorch中計(jì)算網(wǎng)絡(luò)參數(shù)量的一般方法,需要的朋友可以參考下2024-05-05
tensorflow: 查看 tensor詳細(xì)數(shù)值方法
今天小編就為大家分享一篇tensorflow: 查看 tensor詳細(xì)數(shù)值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

