torch.nn里的损失函数:MSE、BCE、BCEWithLogits、NLLLoss、CrossEntropyLoss的用法

1. nn.MSELoss()

模型的预测值与标签的L2距离。一般用于回归问题。之所以不用于分类问题,可能原因为:使用sigmoid之后,函数形式不是凸函数 ,不容易求解 ,容易进入局部最优。

loss = nn.MSELoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
output = loss(input, target)
output.backward()

2. nn.BCELoss()

交叉熵损失函数,衡量两个分布之间的差异,一般用于分类问题。输入的x值需先经过sigmoid压缩到(0,1)之间。标签形式为[0, 0, 1], [0, 1, 1]等,各个类别预测概率独立,类与类之间不互斥,可见不仅能用于二分类问题,也能用于多标签分类问题。

m = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
output = loss(m(input), target)
output.backward()

3. nn.BCEWithLogitsLoss()

交叉熵损失函数, 与nn.BCELoss()不同的是网络的输出无需用sigmoid压缩,函数内部整合了nn.sigmoid()和nn.BCELoss(),并且使用log-sum-exp trick提高了数值稳定性。同样可用于二分类及多标签分类。
这里简单介绍一下log-sum-exp trick:
原始的log-sum-exp公式为:

y = l o g ∑ i e x i y = log\sum_{i}^{}e^{x_{i}} y=logiexi
x i x_{i}

<think>好的,用户想知道PyTorchtorch.nn模块损失函数列表以及使用方法。首先,我需要回忆一下常见的损失函数有哪些,比如MSELossCrossEntropyLoss这些。然后要确定每个损失函数的用途、输入输出格式和注意事项。 首先,我应该列出主要的损失函数,每个函数单独说明。比如MSELoss用于回归任务,计算均方误差。输入通常是模型输出和目标值,要保持形状一致。然后CrossEntropyLoss用于分类,特别是多类分类,这要注意输入是否已经过softmax处理,PyTorch的这个函数内部已经包含了softmax,所以不需要额外处理。 接下来是BCELoss,二分类交叉熵,这时候要强调输入需要经过sigmoid激活,或者使用BCEWithLogitsLoss来结合sigmoid和BCE,这样数值稳定性更好。还有L1Loss,也就是MAE,适用于回归问题中对异常值不敏感的情况。 另外,像NLLLoss需要手动处理log softmax,这可能用在某些特定的模型结构中,比如结合LogSoftmax层。HuberLoss结合了MAE和MSE的特点,在接近目标时使用MSE,远离时用MAE,适合有噪声的数据。这些都需要详细说明。 然后,用户可能需要示例代码来理解如何使用这些损失函数。比如在模型训练时,如何初始化损失函数,计算损失值,并进行反向传播。要注意输入的形状是否正确,比如CrossEntropyLoss的输入是(N, C)而目标是(N),而BCELoss的输入和目标形状要相同。 还需要提到一些注意事项,比如确保输入的范围合适,比如BCELoss的输入应该在0到1之间,或者使用BCEWithLogitsLoss来自动处理。同时,分类任务中标签的类型是否正确,比如是LongTensor还是FloatTensor。 可能用户在实际应用中会遇到问题,比如维度不匹配或者未正确处理激活函数,所以在回答时要强调这些常见错误点。此外,引用文档中的内容,比如引用[3]提到模块的组合使用,可以提醒用户参考官方文档获取更详细的信息。 最后,生成相关的问题,帮助用户扩展知识,比如如何自定义损失函数,多标签分类用什么损失函数,或者损失函数在反向传播中的作用。这些问题可以引导用户进一步学习相关的内容。</think>以下是PyTorch $torch.nn$ 模块中常用损失函数及其使用方法的详细说明: --- ### 1. 均方误差损失 (MSE Loss) **函数名**:$nn.MSELoss()$ **用途**:回归任务,计算预测值与目标值的均方误差 **公式**: $$L = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2$$ **代码示例**: ```python import torch.nn as nn loss_fn = nn.MSELoss() output = model(inputs) loss = loss_fn(output, targets) # output和targets形状需相同 ``` --- ### 2. 交叉熵损失 (CrossEntropyLoss) **函数名**:$nn.CrossEntropyLoss()$ **用途**:多分类任务,自动结合$Softmax$和负对数似然 **输入要求**: - 预测值:未归一化的logits,形状为$(N, C)$($C$为类别数) - 目标值:类别索引,形状为$(N)$,数据类型为$torch.LongTensor$ **代码示例**: ```python loss_fn = nn.CrossEntropyLoss() output = model(inputs) # 输出形状为(batch_size, num_classes) loss = loss_fn(output, targets) # targets形状为(batch_size) ``` --- ### 3. 二元交叉熵损失 (BCELoss) **函数名**:$nn.BCELoss()$ **用途**:二分类任务,需配合$Sigmoid$激活函数使用 **输入要求**: - 预测值:经过$Sigmoid$的输出,范围在$[0,1]$ - 目标值:与预测值形状相同的浮点张量 **代码示例**: ```python loss_fn = nn.BCELoss() output = torch.sigmoid(model(inputs)) # 必须显式应用Sigmoid loss = loss_fn(output, targets.float()) ``` > 推荐使用$nn.BCEWithLogitsLoss()$(结合Sigmoid和BCELoss,数值稳定性更好)[^2] --- ### 4. L1损失 (绝对误差损失) **函数名**:$nn.L1Loss()$ **用途**:回归任务,对异常值敏感度低于MSE **公式**: $$L = \frac{1}{N}\sum_{i=1}^{N}|y_i - \hat{y}_i|$$ **代码示例**: ```python loss_fn = nn.L1Loss() loss = loss_fn(output, targets) ``` --- ### 其他重要损失函数 | 函数名 | 应用场景 | 特点 | |----------------------|----------------------------|-----------------------------------| | $nn.NLLLoss()$ | 需手动添加$LogSoftmax$的分类任务 | 输入为概率对数 | | $nn.KLDivLoss()$ | 概率分布相似性度量 | 用于模型蒸馏等场景 | | $nn.HuberLoss()$ | 回归任务的鲁棒损失 | 结合MSE和MAE特性 | | $nn.CosineEmbeddingLoss()$ | 向量相似度比较 | 用于文本/图像匹配任务 | --- ### 使用注意事项 1. **输入形状匹配**:如$CrossEntropyLoss$要求预测值为$(N,C)$,目标为$(N)$[^3] 2. **激活函数配合**:$BCELoss$需显式使用$Sigmoid$,而$CrossEntropyLoss$自动包含$Softmax$ 3. **数值稳定性**:优先选择带"WithLogits"的版本(如$BCEWithLogitsLoss$) 4. **自定义损失**:可通过继承$nn.Module$实现自定义损失函数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值