Pytorch损失函数torch.nn.NLLLoss()详解

本文深入探讨了深度学习中常见的损失函数,包括交叉熵损失函数和NLLLoss,详细解释了它们的计算原理及相互关系,通过代码示例验证了理论推导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.CrossEntropyLoss),熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小,表示数据越接近真实样本。

交叉熵计算公式:

就是我们预测的概率的对数与标签的乘积,当qk->1的时候,它的损失接近零。

nn.NLLLoss
官方文档中介绍称: nn.NLLLoss输入是一个对数概率向量和一个目标标签,它与nn.CrossEntropyLoss的关系可以描述为:softmax(x)+log(x)+nn.NLLLoss====>nn.CrossEntropyLoss

CrossEntropyLoss()=log_softmax() + NLLLoss() 

其中softmax函数又称为归一化指数函数,它可以把一个多维向量压缩在(0,1)之间,并且它们的和为1.

计算公式:
1
示例代码

import math
z = [1.0, 2.0, 3.0, 4.0, 1.0, 2.0, 3.0]
z_exp = [math.exp(i) for i in z]  
print(z_exp)  # Result: [2.72, 7.39, 20.09, 54.6, 2.72, 7.39, 20.09] 
sum_z_exp = sum(z_exp)  
print(sum_z_exp)  # Result: 114.98 
softmax = [round(i / sum_z_exp, 3) for i in z_exp]
print(softmax)  # Result: [0.024, 0.064, 0.175, 0.475, 0.024, 0.064, 0.175]

log_softmax
log_softmax是指在softmax函数的基础上,再进行一次log运算,此时结果有正有负,log函数的值域是负无穷到正无穷,当x在0—1之间的时候,log(x)值在负无穷到0之间。

nn.NLLLoss
此时,nn.NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来,再去掉负号,再求均值。
代码示例:

import torch
input=torch.randn(3,3)
soft_input = torch.nn.Softmax(dim=0)
soft_input(input)
Out[20]: 
tensor([[0.7284, 0.7364, 0.3343],
        [0.1565, 0.0365, 0.0408],
        [0.1150, 0.2270, 0.6250]])

#对softmax结果取log
torch.log(soft_input(input))
Out[21]: 
tensor([[-0.3168, -0.3059, -1.0958],
        [-1.8546, -3.3093, -3.1995],
        [-2.1625, -1.4827, -0.4701]])

假设标签是[0,1,2],第一行取第0个元素,第二行取第1个,第三行取第2个,去掉负号,即[0.3168,3.3093,0.4701],求平均值,就可以得到损失值。

(0.3168+3.3093+0.4701)/3
Out[22]: 1.3654000000000002

#验证一下

loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
loss(input,target)
Out[26]: tensor(0.1365)

nn.CrossEntropyLoss

loss=torch.nn.NLLLoss()
target=torch.tensor([0,1,2])
loss(input,target)
Out[26]: tensor(-0.1399)
loss =torch.nn.CrossEntropyLoss()
input = torch.tensor([[ 1.1879,  1.0780,  0.5312],
        [-0.3499, -1.9253, -1.5725],
        [-0.6578, -0.0987,  1.1570]])
target = torch.tensor([0,1,2])
loss(input,target)
Out[30]: tensor(0.1365)

以上为全部实验验证两个loss函数之间的关系!!!
torch.nn.functional是PyTorch中的一个模块,用于实现各种神经网络的函数,包括卷积、池化、激活、损失函数等。该模块中的函数是基于Tensor进行操作的,可以灵活地组合使用。 常用函数: 1.卷积函数:torch.nn.functional.conv2d 该函数用于进行二维卷积操作,输入包括输入张量、卷积核张量和卷积核大小等参数。示例代码如下: ```python import torch.nn.functional as F input = torch.randn(1, 1, 28, 28) conv1 = nn.Conv2d(1, 6, 5) output = F.conv2d(input, conv1.weight, conv1.bias, stride=1, padding=2) ``` 2.池化函数:torch.nn.functional.max_pool2d 该函数用于进行二维最大池化操作,输入包括输入张量、池化核大小等参数。示例代码如下: ```python import torch.nn.functional as F input = torch.randn(1, 1, 28, 28) output = F.max_pool2d(input, kernel_size=2, stride=2) ``` 3.激活函数:torch.nn.functional.relu 该函数用于进行ReLU激活操作,输入包括输入张量等参数。示例代码如下: ```python import torch.nn.functional as F input = torch.randn(1, 10) output = F.relu(input) ``` 4.损失函数torch.nn.functional.cross_entropy 该函数用于计算交叉熵损失,输入包括预测结果和真实标签等参数。示例代码如下: ```python import torch.nn.functional as F input = torch.randn(3, 5) target = torch.tensor([1, 0, 4]) output = F.cross_entropy(input, target) ``` 以上是torch.nn.functional模块中的一些常用函数,除此之外还有很多其他函数,可以根据需要进行查阅。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeremy_lf

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值