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