torch.nn.NLLLoss()
nn.NLLLoss输入是一个对数概率向量和一个目标标签
NLLLoss() ,即负对数似然损失函数(Negative Log Likelihood)。
NLLLoss() 损失函数公式:
N
L
L
L
o
s
s
=
−
1
N
∑
k
=
1
N
y
k
(
l
o
g
_
s
o
f
t
m
a
x
)
NLLLoss=-\frac{1}{N}\sum_{k=1}^{N}y_k(log\_softmax)
NLLLoss=−N1k=1∑Nyk(log_softmax)
y
k
y_k
yk表示one_hot 编码之后的数据标签
损失函数运行的结果为
y
k
y_k
yk与经过log_softmax运行的数据相乘,求平均值,在取反。
实际使用NLLLoss()损失函数时,传入的标签,无需进行 one_hot 编码(这个具体是个啥不太清楚???)
这块对于数据相乘还不太清楚,因为下边代码验证的例子,是说输入的target相当于在input中进行选择,选择标签对应的元素
torch.nn.CrossEntropyLoss()
对数据进行softmax,再log,再进行NLLLoss。其与nn.NLLLoss的关系可以描述为:
softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss
相关的代码实现验证:
import torch
input=torch.randn(3,3)
print(input)
soft_input=torch.nn.Softmax(dim=1)
a=soft_input(input)#对数据在1维上进行softmax计算
print(a)
b=torch.log(soft_input(input))#计算log
print(b)
loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
print('NLLLoss:')
print(loss(b,target))#选取第一行取第0个元素,第二行取第1个,
#---------------------第三行取第2个,去掉负号,求平均,得到损失值。
loss=torch.nn.CrossEntropyLoss()
print('CrossEntropyLoss:')
print(loss(input,target))
运行结果:
可以看到当softmax函数在1维上进行计算时,两种方法得到的值相同。
相关源码:
这一点关于torch.nn.CrossEntropyLoss()的源码中可以看到:
进入对应函数:
CrossEntropyLoss()的定义
进入其返回的cross_entropy():
可以看到其是在1维上进行softmax的求解。
参考链接
官方文档
Log_Softmax()激活函数、NLLLoss()损失函数、CrossEntropyLoss()损失函数浅析
Pytorch损失函数torch.nn.NLLLoss()详解