pytorch 动态调整学习率

简介: pytorch 动态调整学习率

订阅专栏

背景

深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁。

本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch

1. 自定义根据 epoch 改变学习率。

这种方法在开源代码中常见,此处引用 pytorch 官方实例中的代码 adjust_lr

1. def adjust_learning_rate(optimizer, epoch):
2. """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
3.     lr = args.lr * (0.1 ** (epoch // 30))
4. for param_group in optimizer.param_groups:
5.         param_group['lr'] = lr

注释:在调用此函数时需要输入所用的 optimizer 以及对应的 epoch ,并且 args.lr 作为初始化的学习率也需要给出。

使用代码示例:

1. optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
2. for epoch in range(10):
3.     adjust_learning_rate(optimizer,epoch)
4.     train(...)
5.     validate(...)

2. 针对模型的不同层设置不同的学习率

当我们在使用预训练的模型时,需要对分类层进行单独修改并进行初始化,其他层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除分类层以外的层只进行微调,不需要过多改变参数,因此需要设置较小的学习率。而改正后的分类层则需要以较大的步子去收敛,学习率往往要设置大一点以 resnet101 为例,分层设置学习率。

1. model = torchvision.models.resnet101(pretrained=True)
2. large_lr_layers = list(map(id,model.fc.parameters()))
3. small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
4. optimizer = torch.optim.SGD([
5.             {"params":large_lr_layers},
6.             {"params":small_lr_layers,"lr":1e-4}
7.             ],lr = 1e-2,momenum=0.9)

注:large_lr_layers 学习率为 1e-2,small_lr_layers 学习率为 1e-4,两部分参数共用一个 momenum

3. 根据具体需要改变 lr

以前使用 keras 的时候比较喜欢 ReduceLROnPlateau 可以根据 损失或者 准确度的变化来改变 lr。最近发现 pytorch 也实现了这一个功能。

class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)

以 acc 为例,当 mode 设置为 “max” 时,如果 acc 在给定 patience 内没有提升,则以 factor 的倍率降低 lr。

使用方法示例:

1. optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
2. scheduler = ReduceLROnPlateau(optimizer, 'max',verbose=1,patience=3)
3. for epoch in range(10):
4.     train(...)
5.     val_acc = validate(...)
6. # 降低学习率需要在给出 val_acc 之后
7.     scheduler.step(val_acc)

4. 手动设置 lr 衰减区间

使用方法示例

1. def adjust_learning_rate(optimizer, lr):
2. for param_group in optimizer.param_groups:
3.         param_group['lr'] = lr
4. 
5. for epoch in range(60):        
6.     lr = 30e-5
7. if epoch > 25:
8.         lr = 15e-5
9. if epoch > 30:
10.         lr = 7.5e-5
11. if epoch > 35:
12.         lr = 3e-5
13. if epoch > 40:
14.         lr = 1e-5
15.     adjust_learning_rate(optimizer, lr)

5. 余弦退火

论文: SGDR: Stochastic Gradient Descent with Warm Restarts

使用方法示例

1. epochs = 60
2. optimizer = optim.SGD(model.parameters(),lr = config.lr,momentum=0.9,weight_decay=1e-4) 
3. scheduler = lr_scheduler.CosineAnnealingLR(optimizer,T_max = (epochs // 9) + 1)
4. for epoch in range(epochs):
5.     scheduler.step(epoch)

目前最常用的也就这么多了,当然也有很多其他类别,详情见 how-to-adjust-learning-rate

参考文献

目录
相关文章
|
6天前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】自调整学习率实例应用(附代码)
【PyTorch实战演练】自调整学习率实例应用(附代码)
73 0
|
9月前
|
机器学习/深度学习 缓存 监控
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
430 0
Pytorch学习笔记(7):优化器、学习率及调整策略、动量
|
6天前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch与迁移学习:利用预训练模型提升性能
【4月更文挑战第18天】PyTorch支持迁移学习,助力提升深度学习性能。预训练模型(如ResNet、VGG)在大规模数据集(如ImageNet)训练后,可在新任务中加速训练,提高准确率。通过选择模型、加载预训练权重、修改结构和微调,可适应不同任务需求。迁移学习节省资源,但也需考虑源任务与目标任务的相似度及超参数选择。实践案例显示,预训练模型能有效提升小数据集上的图像分类任务性能。未来,迁移学习将继续在深度学习领域发挥重要作用。
|
6天前
|
机器学习/深度学习 算法 PyTorch
PyTorch中的动态计算图与静态计算图
【4月更文挑战第18天】PyTorch的动态计算图在运行时构建,灵活且易于调试,适合模型开发,但执行效率相对较低,不易优化。静态计算图预定义,执行效率高,利于优化,适用于对效率要求高的场景,但灵活性和调试难度较大。两者在模型开发与部署阶段各有优势。
|
6天前
|
机器学习/深度学习 PyTorch 算法框架/工具
通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
23 0
|
6天前
|
机器学习/深度学习 算法 PyTorch
PyTorch使用Tricks:学习率衰减 !!
PyTorch使用Tricks:学习率衰减 !!
59 0
|
6天前
|
机器学习/深度学习 算法 PyTorch
从零开始学习线性回归:理论、实践与PyTorch实现
从零开始学习线性回归:理论、实践与PyTorch实现
从零开始学习线性回归:理论、实践与PyTorch实现
|
6天前
|
机器学习/深度学习 编解码 PyTorch
Pytorch迁移学习使用MobileNet v3网络模型进行猫狗预测二分类
MobileNet v1是MobileNet系列中的第一个版本,于2017年由Google团队提出。其主要目标是设计一个轻量级的深度神经网络,能够在移动设备和嵌入式系统上进行图像分类和目标检测任务,并且具有较高的计算效率和较小的模型大小。
108 0
|
6天前
|
机器学习/深度学习 PyTorch 语音技术
Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类
深度学习在图像分类、目标检测、语音识别等领域取得了重大突破,但是随着网络层数的增加,梯度消失和梯度爆炸问题逐渐凸显。随着层数的增加,梯度信息在反向传播过程中逐渐变小,导致网络难以收敛。同时,梯度爆炸问题也会导致网络的参数更新过大,无法正常收敛。 为了解决这些问题,ResNet提出了一个创新的思路:引入残差块(Residual Block)。残差块的设计允许网络学习残差映射,从而减轻了梯度消失问题,使得网络更容易训练。
123 0
|
9月前
|
机器学习/深度学习 并行计算 PyTorch
迁移学习的 PyTorch 实现
迁移学习的 PyTorch 实现