pytorch常用内置loss函数与正则化技术(补充小细节)、优化器(optimizer)

这篇博客详细介绍了PyTorch中的常见损失函数,包括回归任务的MSELoss和分类任务的BCELoss与CrossEntropyLoss。博主强调了在多标签回归和分类中如何使用这些损失函数,并解释了正则化技术在PyTorch中的应用,特别是在优化过程中的L2正则化。

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


前言

本博客主要简要记录一下对pytorch内置损失函数的一些理解和正则化技术在pytorch里面是怎么调用的。

一、常用损失函数(后面用到了新的会一一补充)

1.1 回归中的损失函数

1.1.1 nn.MSELoss()

示例1:向量-向量
import torch
import torch.nn as nn

# 创建一个简单的例子,假设有5个样本
outputs = torch.tensor([[0.9],
                        [0.8],
                        [0.7],
                        [0.6],
                        [0.5]])

# 真实标签,假设每个样本的目标值
targets = torch.tensor([[1],
                        [0.8],
                        [0.6],
                        [0.4],
                        [0.2]], dtype=torch.float32)

# 创建 MSE Loss 实例,默认情况下计算所有数据点的平均损失
criterion_mean = nn.MSELoss()
# 计算损失
loss_mean = criterion_mean(outputs, targets)
print("Mean Loss:", loss_mean.item())

# 设置 reduction 参数为 'sum',计算所有数据点的损失之和
criterion_sum = nn.MSELoss(reduction='sum')
# 计算损失
loss_sum = criterion_sum(outputs, targets)
print("Sum Loss:", loss_sum.item())

# 设置 reduction 参数为 'none',保持每个数据点的单独损失值
criterion_none = nn.MSELoss(reduction='none')
# 计算损失
loss_none = criterion_none(outputs, targets)
print("None Loss:", loss_none)
print("Sum of None Losses:", loss_none.sum())

输出:
在这里插入图片描述

示例2:矩阵–矩阵(维度必须一致才行)

比如在多标签回归中,output就应该是矩阵了,target显然也是矩阵(多标签)
实际上,这段代码中的 inputtarget 都是形状为 (3, 5) 的张量,表示有 3 个样本,每个样本有 5 个输出标签。在均方误差损失函数中,对应位置上的元素会进行相减操作,然后将差的平方求和,最后除以样本数量,得到平均损失。

换句话说,对于每个样本,均方误差损失函数会计算预测值和目标值对应位置上的差的平方,然后对所有位置上的差的平方求和,并求得平均值作为该样本的损失值。然后,对所有样本的损失值再求平均值,得到最终的损失值。

因此,output 是一个标量值,表示所有样本的均方误差损失。

import torch
import torch.nn as nn

loss = nn.MSELoss()
input = torch.randn(3, 5)
target = torch.randn(3, 5)
output = loss(input, target)
print(output)

输出:
在这里插入图片描述
【注】:这种操作适用于多标签输出每个标签都采用同一种类型损失函数。如果采用不同类型损失函数就需要再网络设计层过程中做一些处理了,但是这种方法更加灵活。(后面会专门写篇博客演示这个的-----待更新衔接)

[重要重要!!!!!!!!!]
实际上,如果是多个输出,可以使用PyTorch中的MSELoss函数实现多输出MSE损失。假设模型的输出为一个大小为 B × K B\times K B×K的张量 Y Y Y,表示批次大小为 B B B,每个样本的输出维度为 K K K
同时,我们有一个大小相同的张量 Y t a r g e t Y_{target} Ytarget表示真实标签值。则多输出MSE损失的公式如下:
M S E = 1 B K ∑ i = 1 B ∑ j = 1 K ( y i , j − y t a r g e t i , j ) 2 MSE = \frac{1}{BK}\sum_{i=1}^{B}\sum_{j=1}^{K}(y_{i,j} - y_{target_{i,j}})^2 MSE=BK1i=1Bj=1K(yi,jytargeti,j)2
其中, y i , j y_{i,j} yi,j表示第 i i i个样本的第 j j j个输出预测值, y t a r g e t i , j y_{target_{i,j}} ytargeti,j表示第 i i i个样本的第<

PyTorch中,你可以使用正则化来控制模型的复杂度并减少过拟合。正则化是通过在损失函数中添加一个惩罚项来实现的。常见的正则化方法有L1正则化和L2正则化。 对于L1正则化,你可以使用`torch.nn.L1Loss`作为损失函数的一部分,该损失函数将输入和目标张量之间的绝对差值求和。例如: ```python import torch import torch.nn as nn # 定义模型 model = nn.Linear(10, 1) criterion = nn.L1Loss() # L1损失函数 # 计算正则化损失 l1_loss = 0 for param in model.parameters(): l1_loss += torch.sum(torch.abs(param)) # 计算总损失 output = model(input) loss = criterion(output, target) + alpha * l1_loss # alpha 是正则化系数 # 反向传播和优化步骤 optimizer.zero_grad() loss.backward() optimizer.step() ``` 对于L2正则化,你可以使用`torch.nn.MSELoss`作为损失函数的一部分,该损失函数将输入和目标张量之间的平方差值求和。同样,你可以计算权重的平方和作为正则化项,并将其添加到总损失中。例如: ```python import torch import torch.nn as nn # 定义模型 model = nn.Linear(10, 1) criterion = nn.MSELoss() # L2损失函数 # 计算正则化损失 l2_loss = 0 for param in model.parameters(): l2_loss += torch.sum(torch.pow(param, 2)) # 计算总损失 output = model(input) loss = criterion(output, target) + alpha * l2_loss # alpha 是正则化系数 # 反向传播和优化步骤 optimizer.zero_grad() loss.backward() optimizer.step() ``` 在这两个示例中,`alpha`是正则化系数,用于控制正则化项对总损失的贡献程度。较大的`alpha`值表示更强的正则化效果。你可以根据具体问题和数据集来调整`alpha`的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值