溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Pytorch損失函數(shù)nn.NLLLoss2d()用法是什么

發(fā)布時間:2020-07-08 11:13:08 來源:億速云 閱讀:676 作者:清晨 欄目:開發(fā)技術(shù)

小編給大家分享一下Pytorch損失函數(shù)nn.NLLLoss2d()用法是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

最近做顯著星檢測用到了NLL損失函數(shù)

對于NLL函數(shù),需要自己計算log和softmax的概率值,然后從才能作為輸入

輸入 [batch_size, channel , h, w]

Pytorch損失函數(shù)nn.NLLLoss2d()用法是什么

目標(biāo) [batch_size, h, w]

輸入的目標(biāo)矩陣,每個像素必須是類型.舉個例子。第一個像素是0,代表著類別屬于輸入的第1個通道;第二個像素是0,代表著類別屬于輸入的第0個通道,以此類推。

x = Variable(torch.Tensor([[[1, 2, 1],
       [2, 2, 1],
       [0, 1, 1]],
       [[0, 1, 3],
       [2, 3, 1],
       [0, 0, 1]]]))

x = x.view([1, 2, 3, 3])
print("x輸入", x)

這里輸入x,并改成[batch_size, channel , h, w]的格式。

soft = nn.Softmax(dim=1)

log_soft = nn.LogSoftmax(dim=1)

然后使用softmax函數(shù)計算每個類別的概率,這里dim=1表示從在1維度

上計算,也就是channel維度。logsoftmax是計算完softmax后在計算log值

Pytorch損失函數(shù)nn.NLLLoss2d()用法是什么

手動計算舉個栗子:第一個元素

Pytorch損失函數(shù)nn.NLLLoss2d()用法是什么

y = Variable(torch.LongTensor([[1, 0, 1],
       [0, 0, 1],
       [1, 1, 1]]))

y = y.view([1, 3, 3])

輸入label y,改變成[batch_size, h, w]格式

loss = nn.NLLLoss2d()
out = loss(x, y)
print(out)

輸入函數(shù),得到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

是一致的

注意:這個函數(shù)會對每個像素做平均,每個batch也會做平均,這里有9個像素,1個batch_size。

補(bǔ)充知識: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],
 [1, 2]],
[[5, 3],
 [3, 0]],
[[5, 3],
 [5, 2]],
[[4, 2],
 [3, 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, 2],
 [2, 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損失函數(shù)nn.NLLLoss2d()用法是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI