[深度学习] Pytorch nn.CrossEntropyLoss()和nn.NLLLoss() 区别

本文详细解释了Softmax函数如何将实数向量转换为概率分布,并介绍了两种常用的损失函数:NLLLoss(负对数似然损失)和CrossEntropyLoss(交叉熵损失)。通过实例演示了这两种损失函数的计算过程。

 

  • 函数 Softmax(x)

      是一个 non-linearity, 但它的特殊之处在于它通常是网络中一次操作. 这是因为它接受了一个实数向量并返回一个概率分布.

其定义如下.定义 x 是一个实数的向量(正数或负数都无所谓, 没有限制). 然后, 第i个 Softmax(x) 的组成是 

输出是一个概率分布: 每个元素都是非负的, 并且所有元素的总和都是1.
 

  • NLLLoss(negative log likelihood loss):最大似然 / log似然代价函数
  • CrossEntropyLoss: 交叉熵损失函数。交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。\

Cross Entropy(也就是交叉熵)Loss:交叉熵损失函数,通常用于多分类,其中yi是one_hot标签,pi是softmax层的输出结果,交叉熵损失EE定义为:

Negative Log Liklihood(NLL) Loss:负对数似然损失函数,X是log_softmax()的输出,label是对应的标签位置

损失函数NLLLoss() 的输入是一个对数概率向量和一个目标标签,并对应位置相乘相加,最后再取负(也就是说,这里的Xlabel,,对于独热码来说,实际上就是取的X中,对应于label中为1的那个x).  它不会为我们计算对数概率,适合最后一层是log_softmax()log_softmax也就是对softmax的输出取对数)的网络. 损失函数 CrossEntropyLoss() 与 NLLLoss()类似, 唯一的不同是它为我们去做 softmax并取对数.可以理解为:

CrossEntropyLoss()=log_softmax() + NLLLoss()

CrossEntropyLoss()=log_softmax() + NLLLoss() 
import torch
import torch.nn.functional as F

#output是神经网络最后的输出张量,b_y是标签(1hot)
loss1 = torch.nn.CrossEntropyLoss(output,b_y)
loss2 =F.nll_loss(F.log_softmax(output,1),b_y)
#loss1与loss2等效
import torch
import torch.nn as nn
import torch.nn.functional as F

data = torch.randn(2, 6)
print('data:', data, '\n')

log_soft = F.log_softmax(data, dim=1)
print('log_soft:', log_soft, '\n')

target = torch.tensor([1, 2])

entropy_out = F.cross_entropy(data, target)
nll_out = F.nll_loss(log_soft, target)

print('entropy_out:', entropy_out)
print('nll_out:', nll_out)

 

深度学习中,`nn.CrossEntropyLoss`是PyTorch库提供的一个损失函数,用于训练多类分类问题。该损失函数结合了`nn.LogSoftmax``nn.NLLLoss`(负对数似然损失)两个操作,通常用于评估模型的预测输出实际标签之间的差异。 在初始化`nn.CrossEntropyLoss`时,可以通过关键字参数`reduction`来指定如何对损失进行聚合。`reduction`参数有三个可选值:'mean'(默认值)、'sum''none'。 当`reduction='sum'`时,损失函数会对所有单个损失值求,这意味着它会计算所有样本损失的总。这在训练过程中可以确保每个批次中所有样本的损失都被考虑,并且最终的梯度会受到整个批次大小的影响。这样做的好处是梯度不会因为批次大小的变化而变化,有助于在不同批次大小之间保持学习速率的一致性。 下面是一个简单的例子,说明如何使用`nn.CrossEntropyLoss`: ```python import torch.nn as nn # 假设我们有一个分类问题,总共有10个类别 num_classes = 10 # 创建一个CrossEntropyLoss的实例,指定reduction为'sum' loss_function = nn.CrossEntropyLoss(reduction='sum') # 假设我们的模型输出是未归一化的预测分数 model_output = torch.randn(3, num_classes) # 3个样本,10个类别的输出 # 实际的标签是类别索引,例如[2, 0, 1] true_labels = torch.tensor([2, 0, 1], dtype=torch.long) # 计算损失 loss = loss_function(model_output, true_labels) print(loss) ``` 在这个例子中,`model_output`是模型对于3个样本的预测输出,而`true_labels`是这些样本真实对应的类别索引。调用`loss_function`后,会返回计算得到的总损失值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值