【Pytorch学习】optimizer

本文详细介绍了PyTorch中优化器的作用、常用方法(如zero_grad()和step()),以及如何设置不同参数组和学习率策略。重点讲解了SGD和Adam优化器,以及如何针对不同网络结构动态调整优化器参数。

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

【Pytorch学习】optimizer

前言

深度学习训练模型的步骤为:数据-模型-损失函数-优化器-迭代训练,即首先给网络输入数据,网络通过前向传播,得到模型的输出,然后根据网络输出和真实标签之间的差异(定义的损失函数),通过反向传播得到参数的梯度,最后优化器根据梯度来更新参数。

1.关于优化器

优化器的原理是通过反向传播算法计算损失函数对每个模型参数的梯度,然后根据梯度大小学习率来更新模型参数,从而优化模型的性能。

常用优化器:

  • SGD:随机梯度下降优化器,计算每个样本的梯度并根据学习率更新模型参数。
  • Adam:自适应矩估计优化器,根据每个参数的梯度和梯度平方的移动平均值来计算自适应学习率。
2.常用方法
  1. zero_grad()

作用:在梯度求导之前(backward之前)把梯度清零

  1. step()

作用:执行当前采用的优化器策略进行参数更新

  1. add_param_group()
  • 用途:添加一组参数到优化器中,为神经网络中的不同层或参数集使用不同的学习率、权重衰减或动量
  • 参数:接收一个字典作为输入,该字典包含以下键
    • params: 需要优化的参数张量列表。
    • lr: 参数组的学习率。
    • weight_decay:参数组的权重衰减值。
    • momentum: 参数组的动量因子。
    • dampening: 参数组动量修正的衰减。
    • nesterov: 是否使用nesterov动量作为参数组。
3.常见训练框架
import torch

# 1.定义模型网络并实例化
model = Net()
 
# 2.取出模型不同结构的参数以便分别优化
 pg0, pg1, pg2 = [], [], []  
        for k, v in model.named_modules():
            if hasattr(v, "bias") and isinstance(v.bias, nn.Parameter):
                pg2.append(v.bias)    
            if isinstance(v, nn.BatchNorm2d) or "bn" in k:
                pg0.append(v.weight)    
            elif hasattr(v, "weight") and isinstance(v.weight, nn.Parameter):
                pg1.append(v.weight)   
                
# 3. 选择优化器,实例化,如:
optimizer = torch.optim.SGD(pg0, lr=LR, momentum=0.9...)  #这里第一个参数就是模型中需要优化的可微分参数。

# 4. 不同网络结构参数 设置 不同优化器参数
optimizer.add_param_group({"params": pg1, "weight_decay": weight_decay})
optimizer.add_param_group({"params": pg2})

# 5.1 设置学习率下降策略(可自定义)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=10, gama=0.1) # 设置学习率下降策略

# 以下代码应出现在循环中
# 4. 调用网络获取输出
outputs = model(inputs)

# 5. 梯度清零,反向传播之前进行
optimizer.zero_grad()

# 6. 获取损失值
loss = criterion(outputs, labels) 

# 7. 反向传播,获取梯度
loss.backward() 

# 8. 通过优化器,更新参数
optimizer.step() 

               

如果要动态修改学习率,一般方法是:

# 5.2 自定义学习率函数
def set_optimizer_lr(optimizer, lr_scheduler_func, epoch)
    lr = lr_scheduler_func(epoch)  # 自定义学习率函数
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值