Pytorch學習筆記12----損失函數nn.CrossEntropyLoss()、nn.NLLLoss()


1.CrossEntropyLoss()損失函數

交叉熵主要是用來判定實際的輸出與期望的輸出的接近程度,為什么這么說呢,舉個例子:在做分類的訓練的時候,如果一個樣本屬於第K類,那么這個類別所對應的的輸出節點的輸出值應該為1,而其他節點的輸出都為0,即[0,0,1,0,….0,0],這個數組也就是樣本的Label,是神經網絡最期望的輸出結果。也就是說用它來衡量網絡的輸出與標簽的差異,利用這種差異經過反向傳播去更新網絡參數。

nn.CrossEntropyLoss()這個損失函數用於多分類問題雖然說的是交叉熵,但是和我理解的交叉熵不一樣。nn.CrossEntropyLoss()是nn.logSoftmax()和nn.NLLLoss()的整合,可以直接使用它來替換網絡中的這兩個操作。下面我們來看一下計算過程。

首先輸入是size是(minibatch,C)。這里的C是類別數。損失函數的計算如下:

損失函數中也有權重weight參數設置,若設置權重,則公式為:

其他參數不具體說,和nn.BCELoss()設置差不多,默認情況下,對minibatch的loss求均值。

注意這里的標簽值class,並不參與直接計算,而是作為一個索引,索引對象為實際類別

舉個栗子,我們一共有三種類別,批量大小為1(為了好計算),那么輸入size為(1,3),具體值為torch.Tensor([[-0.7715, -0.6205,-0.2562]])。標簽值為target = torch.tensor([0]),這里標簽值為0,表示屬於第0類。loss計算如下:

import torch
import torch.nn as nn
import math

entroy=nn.CrossEntropyLoss()
input=torch.Tensor([[-0.7715, -0.6205,-0.2562]])
target = torch.tensor([0])
output = entroy(input, target)
print(output)
#根據公式計算

輸出:

tensor(1.3447)

動手自己算:

 

參考文獻:

https://blog.csdn.net/geter_CS/article/details/84857220

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM