參考鏈接:
https://www.cnblogs.com/JeasonIsCoding/p/10171201.html
https://blog.csdn.net/qq_27095227/article/details/103775032
二分類的交叉熵公式是:
如果是多分類,交叉熵公式如下:
這里為了更加直觀的理解計算過程,舉例說明:
比如我們舉例:
假設我們有個一樣本,他經過我們的神經網絡后會輸出一個5維的向量,分別代表這個樣本分別屬於這5種標簽的數值,(注意此時我們的5個數求和還並不等於1,需要先經過softmax處理).比如,我們的對應的5類的輸出以及正確的標簽類別:
inputs = torch.FloatTensor([[-0.3830,-0.0102,-1.4235,-0.5212,0.9011]])
target = torch.LongTensor([4])
在計算之前,我們首先需要計算y冒號,
這是經過softmax的各個類別的得分,加起來和為1. softma公式如下:
y冒有了還缺
這個是真實標簽,會根據類別整成one-hot形式,現在類別是4,那么就是[0,0,0,0,1]. 所以,這兩個都有了,帶入上面公式:
import torch
import torch.nn as nn
import math
inputs = torch.FloatTensor([[-0.3830,-0.0102,-1.4235,-0.5212,0.9011]])
target = torch.LongTensor([4])
ce = nn.CrossEntropyLoss()
loss = ce(inputs, target)
print(loss)
sum_ = 0
for i in range(5):
sum_ += math.exp(inputs[0][i])
my_resutlt = -0.9011 + math.log(sum_)
print("my_=",my_resutlt)
打印如下:
tensor(0.7020)
my_= 0.7020485611606857
可以看到結果一致!