【Pytorch学习】optimizer
前言
深度学习训练模型的步骤为:数据-模型-损失函数-优化器-迭代训练,即首先给网络输入数据,网络通过前向传播,得到模型的输出,然后根据网络输出和真实标签之间的差异(定义的损失函数),通过反向传播得到参数的梯度,最后优化器根据梯度来更新参数。
1.关于优化器
优化器的原理是通过反向传播算法计算损失函数对每个模型参数的梯度,然后根据梯度大小和学习率来更新模型参数,从而优化模型的性能。
常用优化器:
- SGD:随机梯度下降优化器,计算每个样本的梯度并根据学习率更新模型参数。
- Adam:自适应矩估计优化器,根据每个参数的梯度和梯度平方的移动平均值来计算自适应学习率。
2.常用方法
作用:在梯度求导之前(backward之前)把梯度清零
作用:执行当前采用的优化器策略进行参数更新
- 用途:添加一组参数到优化器中,为神经网络中的不同层或参数集使用不同的学习率、权重衰减或动量
- 参数:接收一个字典作为输入,该字典包含以下键
- 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