torch.optim.lr_scheduler
根据epoch训练次数调整学习率
torch.optim.lr_scheduler.LambdaLR
允许通过自定义函数调整学习率
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)
new = λ × initial
- optimizer (Optimizer):要更改学习率的优化器;
- lr_lambda(function or list):根据epoch计算λ的函数;或者是一个list的这样的function,分别计算各个parameter groups的学习率更新用到的λ;
- 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,做一次更新:
- optimizer (Optimizer):要更改学习率的优化器;
- step_size(int):每训练step_size个epoch,更新一次参数;
- gamma(float):更新lr的乘法因子;
- 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