本篇借鑒了這篇文章,如果有興趣,大家可以看看:https://blog.csdn.net/geter_CS/article/details/84857220
1、交叉熵:交叉熵主要是用來判定實際的輸出與期望的輸出的接近程度
2、CrossEntropyLoss()損失函數結合了nn.LogSoftmax()和nn.NLLLoss()兩個函數。它在做分類(具體幾類)訓練的時候是非常有用的。
3、softmax用於多分類過程中,它將多個神經元的輸出,映射到(0,1)區間內,可以看成概率來理解,從而來進行多分類!
其公式如下:
4、Pytorch中CrossEntropyLoss()函數的主要是將softmax-log-NLLLoss合並到一塊得到的結果。
1、Softmax后的數值都在0~1之間,所以ln之后值域是負無窮到0。
2、然后將Softmax之后的結果取log,將乘法改成加法減少計算量,同時保障函數的單調性 。
3、NLLLoss的結果就是把上面的輸出與Label對應的那個值拿出來,去掉負號,再求均值。
5、沒有權重的損失函數的計算如下:
有權重的損失函數的計算如下:
注意這里的標簽值class,並不參與直接計算,而是作為一個索引,索引對象為實際類別
6、
舉個栗子,我們一共有三種類別,批量大小為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 numpy as np entroy = nn.CrossEntropyLoss() input = torch.Tensor([[-0.7715,-0.6205,-0.2562]]) target = torch.tensor([0]) output = entroy(input,target) print(output) #采用CrossEntropyLoss計算的結果。 myselfout = -(input[:,0])+np.log(np.exp(input[:,0])+np.exp(input[:,1])+np.exp(input[:,2])) #自己帶公式計算的結果 print(myselfout) lsf = nn.LogSoftmax() loss = nn.NLLLoss() lsfout = lsf(input) lsfnout = loss(lsfout,target) print(lsfnout)
結果:
tensor(1.3447) tensor([1.3447]) tensor(1.3447)