torch.nn.CrossEntropyLoss(),torch.nn.NLLLoss()函数

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=1Nyk(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()详解

你可能感兴趣的:(python代码有关,python,深度学习,机器学习)