Pytorch常用的交叉熵損失函數CrossEntropyLoss()詳解


本篇借鑒了這篇文章,如果有興趣,大家可以看看: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)

 


免責聲明!

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



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