Pytorch損失函式nn.NLLLoss2d()用法說明
阿新 • • 發佈:2020-07-08
最近做顯著星檢測用到了NLL損失函式
對於NLL函式,需要自己計算log和softmax的概率值,然後從才能作為輸入
輸入 [batch_size,channel,h,w]
目標 [batch_size,w]
輸入的目標矩陣,每個畫素必須是型別.舉個例子。第一個畫素是0,代表著類別屬於輸入的第1個通道;第二個畫素是0,代表著類別屬於輸入的第0個通道,以此類推。
x = Variable(torch.Tensor([[[1,2,1],[2,[0,1,1]],[[0,3],3,1]]])) x = x.view([1,3]) print("x輸入",x)
這裡輸入x,並改成[batch_size,w]的格式。
soft = nn.Softmax(dim=1)
log_soft = nn.LogSoftmax(dim=1)
然後使用softmax函式計算每個類別的概率,這裡dim=1表示從在1維度
上計算,也就是channel維度。logsoftmax是計算完softmax後在計算log值
手動計算舉個栗子:第一個元素
y = Variable(torch.LongTensor([[1,[1,1]])) y = y.view([1,3])
輸入label y,改變成[batch_size,w]格式
loss = nn.NLLLoss2d() out = loss(x,y) print(out)
輸入函式,得到loss=0.7947
來手動計算
第一個label=1,則 loss=-1.3133
第二個label=0, 則loss=-0.3133
. … … loss= -(-1.3133-0.3133-0.1269-0.6931-1.3133-0.6931-0.6931-1.3133-0.6931)/9 =0.7947222222222223
是一致的
注意:這個函式會對每個畫素做平均,每個batch也會做平均,這裡有9個畫素,1個batch_size。
補充知識:PyTorch:NLLLoss2d
我就廢話不多說了,大家還是直接看程式碼吧~
import torch import torch.nn as nn from torch import autograd import torch.nn.functional as F inputs_tensor = torch.FloatTensor([ [[2,4],2]],[[5,[3,0]],[5,[[4,2],]) inputs_tensor = torch.unsqueeze(inputs_tensor,0) # inputs_tensor = torch.unsqueeze(inputs_tensor,1) print '--input size(nBatch x nClasses x height x width): ',inputs_tensor.shape targets_tensor = torch.LongTensor([ [0,3] ]) targets_tensor = torch.unsqueeze(targets_tensor,0) print '--target size(nBatch x height x width): ',targets_tensor.shape inputs_variable = autograd.Variable(inputs_tensor,requires_grad=True) inputs_variable = F.log_softmax(inputs_variable) targets_variable = autograd.Variable(targets_tensor) loss = nn.NLLLoss2d() output = loss(inputs_variable,targets_variable) print '--NLLLoss2d: {}'.format(output)
以上這篇Pytorch損失函式nn.NLLLoss2d()用法說明就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。