学习率动态调整代码实现-pytorch

更详细用法建议查看pytorch官方文档,如有错误,恳请指出


前言

初学者,记录学习率调整的几种方法和实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、手动设置学习率

import torch
import matplotlib.pyplot as plt
from torch.optim import *
import torch.nn as nn
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义网络
class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.fc = nn.Linear(1, 10)
    def forward(self, x):
        return self.fc(x)
        
model = net()
LR = 0.01
optimizer = Adam(model.parameters(), lr=LR)
lr_list = [] # 方便打印学习率曲线
for epoch in range(100):
    if epoch % 5 == 0:
        for p in optimizer.param_groups:
            p['lr'] *= 0.9 # 每5个epoch衰减1次
    lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
plt.plot(range(100), lr_list, color='r')
plt.title('手动设置')
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()

在这里插入图片描述


torch.optim.lr_scheduler 里有许多自动调整学习的方法

二、用 lamda 函数作为学习率的乘积因子更新学习率

torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)
  • optimizer 传入的优化器
  • lr_lambda lamda 表达式
  • last_epoch 不用管 (默认-1,和训练中断,接着训练的情况有关)
  • verbose 设为True,每更新学习率自动打印学习率。 Adjusting learning rate of group 0 to 10e-4 defaule=False
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(), lr=LR)
lambda1 = lambda epoch: 1 / (epoch + 1)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1)
for epoch in range(100):
    scheduler.step() # 注意,学习率的更新需放到优化器更新后
    # lr_list.append(optimizer.state_dict()['param_groups'][0]['lr']) 
    lr_list.append(scheduler.get_last_lr()) # 更简洁
plt.plot(range(100), lr_list, color='r')
plt.title('LambdaLR')
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()
print(lr_list[0], lr_list[1], lr_list[2]) # 0.005  0.003333333333333333  0.0025

在这里插入图片描述

三、用 StepLR 固定步长的学习率衰减

torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
  • optimizer
  • step_size 更新步长,多少个epoch更新一次
  • gamma 固定了的衰减因子
  • last_epoch
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(), lr=LR)
scheduler = lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.8)
for epoch in range(100):
    scheduler.step()
    # lr_list.append(optimizer.state_dict()['param_groups'][0]['lr'])
    lr_list.append(scheduler.get_last_lr())
plt.plot(range(100), lr_list, color='r')
plt.title('StepLR')
plt.xlabel('epoch')
plt.ylabel('lr')
plt.show()

在这里插入图片描述

四、用 MultiStepLR 控制衰退时机

torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1, verbose=False)
  • optimizer
  • milestones 衰退列表,需升序排列,如[20,50] ,第20、50epoch时更新LR
  • gamma
  • last_epoch
  • verbose
lr_list = []
model = net()
LR = 0.01
optimizer = Adam(model.parameters(), lr=LR)
scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[20, 80], gamma=0.9)
for epoch in range(100):
    scheduler.step() # 第20epoch和第80个epoch时学习率衰减
    lr_list.append(scheduler.get_last_lr())
plt.plot(range(100), lr_list, color='r')
plt.xlabel('epoch')
plt.ylabel('lr')
plt.title('MultiStepLR')
plt.show()

在这里插入图片描述

五、ReduceLROnPlateau 根据训练中某写些指标动态调节学习率

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

当一个指标停止改进时,降低learning rate。一旦学习停滞不前,模型通常会从降低2-10倍的learning rate中受益。scheduler会读取一个指标,如果在 patience个epoch里内没有看到任何改善,learning rate就会降低。

  • optimizer 优化器
  • modemin、max模式,在mode=min时,监测的指标停止减小时,lr被降低。mode=max时,指标停止上升升时,lr被降低。default=min
  • factor 即gamma。new_lr = lr * factor. default=0.1
  • patiencepatience = 2,当连续2次指标没改善时,第3次如果还没改善,则降低学习率 default=10
  • threshold
  • threshold_mode
  • cooldown
  • min_lr 学习率的下限 default=0
  • eps 如果新旧lr之间的差异小于eps,更新将被忽略 default=1e-8
  • verbose 每次更新都会向stdout打印一条信息。default=False
# 官方示例
optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = ReduceLROnPlateau(optimizer, 'min')
for epoch in range(10):
    train(...)
    val_loss = validate(...)
    # Note that step should be called after validate()
    scheduler.step(val_loss) # 监测val_loss

ExponentialLR、CosineAnnealingLR 不常用

六、ExponentialLR

torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch=-1, verbose=False)

每训练一个epoch,学习率衰减一次

七、CosineAnnealingLR

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)

按照余弦波形的衰减周期来更新学习率,前半个周期从最大值降到最小值,后半个周期从最小值升到最大值

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
complex-yolov4-pytorch是一个基于PyTorch实现的复杂目标检测算法,其复现过程涉及到模型结构、参数设置以及训练测试流程等多个方面。 首先,复现complex-yolov4-pytorch需要详细了解论文中提出的模型结构和损失函数等细节,然后根据论文中的描述在PyTorch框架下构建模型,包括网络层的搭建、激活函数的选择等,并且要注意模型参数的初始化和正则化操作。 其次,对于训练数据的处理也是复现过程中的重要环节,需要根据论文中提供的数据集或自己的数据集进行预处理,包括数据增强、标签生成等操作,以及构建数据加载器并进行合适的数据分割。 接着,需要根据论文中给出的训练策略和超参数设置来实现模型的训练过程,包括学习的调度、优化器的选择、损失函数的定义等,同时要注意在训练过程中记录和保存模型参数和训练日志。 最后,针对复现模型的性能进行评估和测试,可以使用论文中提出的评价指标来计算模型在测试集上的表现,并根据实际需求对模型进行调优和改进。 总之,复现complex-yolov4-pytorch是一个综合性的任务,需要对目标检测算法有深入的理解,并具备较高的PyTorch编程能力和实践经验。在复现过程中要注重细节,对比论文中的描述和代码实现进行验证,并根据实际情况进行适当的调整和优化,以获得更好的模型性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值