【pytorch学习笔记】各种各样的学习率策略

本文详细介绍了PyTorch库中的各种学习率调度器,如LambdaLR、StepLR、MultiStepLR、ExponentialLR、CosineAnnealingLR、CyclicLR、OneCycleLR和ReduceLROnPlateau,以及如何在实际项目中使用它们来动态调整训练过程中的学习率。
摘要由CSDN通过智能技术生成

torch.optim.lr_scheduler

根据epoch训练次数调整学习率

torch.optim.lr_scheduler.LambdaLR

允许通过自定义函数调整学习率

class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)

new = λ × initial

  1. optimizer (Optimizer):要更改学习率的优化器;
  2. lr_lambda(function or list):根据epoch计算λ的函数;或者是一个list的这样的function,分别计算各个parameter groups的学习率更新用到的λ;
  3. last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

torch.optim.lr_scheduler.StepLR

class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)

每经过step_size个epoch,做一次更新:
在这里插入图片描述

  1. optimizer (Optimizer):要更改学习率的优化器;
  2. step_size(int):每训练step_size个epoch,更新一次参数;
  3. gamma(float):更新lr的乘法因子;
  4. last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

torch.optim.lr_scheduler.MultiStepLR

class torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

在这里插入图片描述

milestones(list):递增列表,存放要更新lr的epoch
其余参数如上

torch.optim.lr_scheduler.ExponentialLR

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

在这里插入图片描述
指数衰减法:通过指定衰减因子来控制学习率的减小速度。

scheduler = ExponentialLR(optimizer, gamma=0.9)

torch.optim.lr_scheduler.CosineAnnealingLR

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

使lr随epoch的变化类似于cos函数:周期性变化
在这里插入图片描述

eta_min表示最小学习率 (lr的最小值,默认为0)
T_max表示周期的1/4
eg.T_max = 20 则80 epoch 是cos函数的一个周期

torch.optim.lr_scheduler.CyclicLR

循环学习率策略:学习率在事先指定的上下界之间循环变化。该策略可以帮助模型在训练过程中探索更广阔的学习率范围,从而更好地优化模型的性能。

scheduler = CyclicLR(optimizer, base_lr=0.01, max_lr=0.1, mode='triangular', step_size_up=200, step_size_down=200)

base_lr:循环中学习率的最低值。
max_lr:循环中学习率的最高值。
step_size_up:循环上升阶段的步数。在这个阶段内,学习率会从 base_lr 增加到 max_lr。
step_size_down:循环下降阶段的步数。在这个阶段内,学习率会从 max_lr 降低到 base_lr。
mode:循环模式。可以选择的模式包括:
‘triangular’:三角形模式,学习率在循环中逐渐增加和减小。
‘triangular2’:三角波模式,学习率在循环中逐渐增加和减小,并且每个上升/下降阶段的持续时间是上一个阶段的两倍。
‘exp_range’:指数范围模式,学习率在循环中按指数方式增加和减小。
gamma:循环中学习率的衰减率。仅在 mode=‘exp_range’ 时有效。
scale_fn:自定义学习率更新函数。可以传递一个函数来自定义学习率的更新方式。
scale_mode:学习率更新函数的模式。可以选择的模式包括:
1.‘iteration’:基于迭代次数的学习率更新。
2.‘epoch’:基于周期(epoch)的学习率更新。

torch.optim.lr_scheduler.OneCycleLR

一周期学习率策略

scheduler = OneCycleLR(optimizer, max_lr=0.1, epochs=num_epochs, steps_per_epoch=len(train_loader))

max_lr:训练过程中学习率的最高值。
total_steps:总的训练步数。可以通过 epochs 和 steps_per_epoch 计算得出,或者直接指定。
epochs:训练周期数。
steps_per_epoch:每个周期中的步数。
pct_start:学习率上升阶段的比例。在训练过程中,学习率从最低值增加到 max_lr 的过程中所占比例。
anneal_strategy:学习率下降策略。可以选择的策略包括:
1.‘cos’:余弦退火策略,在剩余训练步骤中将学习率从 max_lr 降低到最低值。
2.‘linear’:线性下降策略,在剩余训练步骤中线性降低学习率。

torch.optim.lr_scheduler.CosineAnnealingWarmRestarts

余弦退火学习率调整策略:学习率在训练过程中按照余弦函数的形式逐渐降低。
热重启学习率策略:在特定的周期之后将学习率重置为初始值,然后再次进行余弦退火。
这种组合策略可以帮助模型在训练过程中跳出局部最优并更好地探索参数空间。

scheduler = CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2)

指定初始周期长度 T_0 和周期倍增因子 T_mult。

torch.optim.lr_scheduler.ReduceLROnPlateau

唯一不依赖epoch更新lr的scheduler:基于训练中某些测量值使学习率动态下降

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)

给定一个metric,
1.mode(str):
==“min”:metric不再下降时减小lr
== “max”:metric不再增长时减小lr
2.patience(int):metric停止优化patience个epoch后减小lr

net_1 = model()

optimizer_1 = torch.optim.Adam(net_1.parameters(), lr = initial_lr)
scheduler_1 = ReduceLROnPlateau(optimizer_1, mode='min', factor=0.1, patience=2)

print("初始化的学习率:", optimizer_1.defaults['lr'])

for epoch in range(1, 15):
    # train

    test = 2
    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step(test)

输出:

初始化的学习率: 0.1
第1个epoch的学习率:0.100000
第2个epoch的学习率:0.100000
第3个epoch的学习率:0.100000
第4个epoch的学习率:0.100000
第5个epoch的学习率:0.010000
第6个epoch的学习率:0.010000
第7个epoch的学习率:0.010000
第8个epoch的学习率:0.001000
第9个epoch的学习率:0.001000
第10个epoch的学习率:0.001000
第11个epoch的学习率:0.000100
第12个epoch的学习率:0.000100
第13个epoch的学习率:0.000100
第14个epoch的学习率:0.000010

torch.optim.optimizer

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)

参数

params

must be Iterable

优化多个网络的参数

1.合并优化,当成一个网络的参数来优化
(一般赋值为[*net_1.parameters(), *net_2.parameters(), …, *net_n.parameters()]或itertools.chain(net_1.parameters(), net_2.parameters(), …, net_n.parameters()));
2.当成多个网络优化,这样可以很容易的让多个网络的学习率各不相同
(一般赋值为[{‘params’: net_1.parameters()}, {‘params’: net_2.parameters()}, …, {‘params’: net_n.parameters()})

属性

optimizer.defaults

字典
存放这个优化器的一些初始参数:‘lr’, ‘betas’, ‘eps’, ‘weight_decay’, ‘amsgrad’

optimizer.param_groups

含有多个字典的列表
每个网络的优化都是一个字典

optimizer_3 = torch.optim.Adam([{"params": net_1.parameters()}, {"params": net_2.parameters()}], lr = initial_lr)
# len(optimizer_3.param_groups): 2

参考

【PyTorch】搞定学习率:torch.optim.lr_scheduler用法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值