一、常用的函数有: log_softmax,nll_loss, cross_entropy
1.log_softmax
log_softmax就是log和softmax合并在一起执行,log_softmax=log+softmax
2. nll_loss
nll_loss函数全称是negative log likelihood loss, 函数表达式为:f(x,class)=−x[class]
例如:假设x=[5,6,9], class=1, 则f(x,class)=−x[1]=−6
3. cross_entropy交叉熵
cross_entropy=log+softmax+nll_loss
二、代码实现
import torch
import torch.nn.functional as F
preds = torch.tensor([[0.1, 0.2, 0.3, 0.4], [0.1, 0.1, 0.1, 0.1]])
target = torch.tensor([2, 3])
print('三种方式实现交叉熵损失')
print('----------------手动实现------------------------------')
one_hot = F.one_hot(target).float() # 对标签作 one_hot 编码
print('[1]one_hot编码target:\n', one_hot)
exp = torch.exp(preds)
print('[2]对网络预测preds求指数:\n', exp)
sum_ = torch.sum(exp, dim=1).reshape(-1, 1) # 按行求和
softmax = exp / sum_ # 计算 softmax()
print('[3]softmax操作:\n', softmax)
log_softmax = torch.log(softmax) # 计算 log_softmax()
print('[4]softmax后取对数:\n', log_softmax)
nllloss = -torch.sum(one_hot * log_softmax) / target.shape[0] # 标签乘以激活后的数据,求平均值,取反
print("[5]手动计算交叉熵:", nllloss)
print('----------------调用log_softmax+nll_loss实现------------------------------')
# 调用 NLLLoss() 函数计算
Log_Softmax = F.log_softmax(preds, dim=1) # log_softmax() 激活
Nllloss = F.nll_loss(Log_Softmax, target) # 无需对标签作 one_hot 编码
print("函数使用Nllloss计算交叉熵:", Nllloss)
print('------------------调用cross_entropy实现----------------------------')
# 直接使用交叉熵损失函数 CrossEntropy_Loss()
cross_entropy = F.cross_entropy(preds, target) # 无需对标签作 one_hot 编码
print('函数交叉熵cross_entropy:', cross_entropy)
查看结果,可以看到三种方式计算的结果是一样的。