Torch的损失函数总结

本文总结了Torch中常用的损失函数,包括L1Loss、SmoothL1Loss(Huber Loss)、MSELoss(均方误差)、BCELoss(二值交叉熵)和CrossEntropyLoss。这些损失函数在不同场景下有不同的应用,如L1Loss和MSELoss常用于回归任务,BCELoss适合二分类,而CrossEntropyLoss则适用于多分类问题。

nn.L1Loss
取预测值和真实值的绝对误差的平均数。
loss⁡(x,y)=1N∑i=1N∣x−y∣ \operatorname{loss}(\mathbf{x}, \mathbf{y})=\frac{1}{N} \sum_{i=1}^{N}|\mathbf{x}-\mathbf{y}| loss(x,y)=N1i=1Nxy

nn.SmoothL1Loss
也叫作 Huber Loss,误差在 (-1,1) 上是平方损失,其他情况是 L1 损失。
loss⁡(x,y)=1N{ 12(xi−yi)2 if ∣xi−yi∣<1∣xi−yi∣−12, otherwise  \operatorname{loss}(\mathbf{x}, \mathbf{y})=\frac{1}{N}\left\{\begin{array}{cc}{\frac{1}{2}\left(\mathbf{x}_{i}-\mathbf{y}_{i}\right)^{2}} & {\text { if }\left|\mathbf{x}_{i}-\mathbf{y}_{i}\right|<1} \\ {\left|\mathbf{x}_{i}-\mathbf{y}_{i}\right|-\frac{1}{2},} & {\text { otherwise }}\end{array}\right. loss(x,y)=N1{ 21(xiy

### PyTorch 损失函数的使用方法与实现方式 #### 一、PyTorch 中常见的损失函数及其用途 PyTorch 提供了多种内置的损失函数,用于解决不同的机器学习问题。以下是几种常用的损失函数: 1. **NLLLoss**: `torch.nn.NLLLoss` 是一种负对数似然损失函数,适用于分类任务中的概率分布计算。为了配合该函数,模型输出通常会经过 `LogSoftmax` 转换为对数概率后再传入此函数[^1]。 2. **CrossEntropyLoss**: 这是一种集成化的损失函数,内部实现了 Softmax 和 NLLLoss 的功能,因此可以直接接受未经处理的原始分数作为输入[^4]。其定义如下: ```python import torch import torch.nn as nn # 定义 CrossEntropyLoss 函数 cross_entropy_loss = nn.CrossEntropyLoss() # 假设预测值和真实标签分别为 predictions 和 labels predictions = torch.randn(3, 4) # 批量大小为3,类别数为4 labels = torch.tensor([1, 2, 3]) # 对应的真实标签 # 计算交叉熵损失 loss = cross_entropy_loss(predictions, labels) print(loss) ``` 3. **MSELoss**: 平方误差损失函数 (`Mean Squared Error Loss`) 主要应用于回归问题中。可以通过调整参数 `reduction` 来控制返回的是均值还是逐项损失[^3]: ```python import torch import torch.nn as nn # 定义 MSE 损失函数 mse_loss_fn = nn.MSELoss(reduction='mean') # 输入张量和目标张量 input_tensor = torch.tensor([2.0, 4.0, 6.0]) target_tensor = torch.tensor([1.0, 3.0, 5.0]) # 计算 MSE 损失 loss = mse_loss_fn(input_tensor, target_tensor) print(loss) ``` 4. **自定义损失函数**: 如果现有的损失函数无法满足需求,可以手动编写新的损失函数。例如,在某些特定场景下可能需要设计特殊的对比损失或排序损失[^5]。 #### 二、具体实现细节分析 - **关于 NLLLoss 的实现**: 当前版本支持通过指定维度来执行 LogSoftmax 变换,并随后利用 NLLLoss 计算最终的结果。需要注意的是,默认情况下会对所有样本求平均;如果希望保留每条记录单独的损失值,则需设置参数 `reduction='none'`[^2]。 - **针对多类别的交叉熵优化**: 在实际项目里推荐优先选用 `nn.CrossEntropyLoss()` 替代组合形式(即分别调用 softmax 和 nllloss),因为前者不仅简化了代码逻辑而且性能更优[^4]。 - **灵活运用 reduction 参数**: 不同的任务背景决定了是否应该采用整体评估指标或者局部反馈机制。比如在训练初期阶段可能会倾向于观察个体表现以便及时发现问题所在;而后期则更加关注全局效果提升效率。 #### 三、总结说明 综上所述,合理选择并正确配置适合当前应用场景下的损失函数至关重要。无论是标准库提供的通用解决方案亦或是定制开发专属方案都需要充分理解各自特点以及适用范围才能达到最佳实践目的。 ```python import torch import torch.nn as nn # 自定义一个简单的线性网络结构 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc = nn.Linear(10, 3) def forward(self, x): return self.fc(x) model = SimpleNet() criterion = nn.CrossEntropyLoss() # 或者其他类型的损失函数 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) inputs = torch.randn(5, 10) # 构造一批次随机数据 targets = torch.randint(0, 3, (5,)) # 随机生成对应的目标值 outputs = model(inputs) loss = criterion(outputs, targets) print(f"初始损失: {loss.item()}") optimizer.zero_grad() loss.backward() optimizer.step() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值