网站超级推广,衡水专业做wap网站,网上商城网站建设设计方案,百度搜索一下PyTorch框架学习十四——学习率调整策略一、_LRScheduler类二、六种常见的学习率调整策略1.StepLR2.MultiStepLR3.ExponentialLR4.CosineAnnealingLR5.ReduceLRonPlateau6.LambdaLR在上次笔记优化器的内容中介绍了学习率的概念#xff0c;但是在整个训练过程中学习率并不是一直…
PyTorch框架学习十四——学习率调整策略一、_LRScheduler类二、六种常见的学习率调整策略1.StepLR2.MultiStepLR3.ExponentialLR4.CosineAnnealingLR5.ReduceLRonPlateau6.LambdaLR在上次笔记优化器的内容中介绍了学习率的概念但是在整个训练过程中学习率并不是一直不变的一般学习率是要先设置的大一些然后在训练过程中慢慢减小。这次笔记就简单介绍一下PyTorch中学习率调整策略。
一、_LRScheduler类
是各种具体学习率调整策略方法函数所要继承的基类。
主要属性
optimizer关联的优化器last_epoch记录epoch数base_lrs记录初始学习率
主要方法
step()更新下一个epoch的学习率。get_lr()虚函数计算下一个epoch的学习率。
二、六种常见的学习率调整策略
1.StepLR
功能等间隔调整学习率。
torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma0.1, last_epoch-1)参数如下
step_size调整间隔数学习率衰减的周期。gamma调整系数默认为0.1。
调整方式lr lr * gamma
举个栗子
# 导入模块、设定超参数、给定权重数据
import torch
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
torch.manual_seed(1)LR 0.1
iteration 10
max_epoch 200weights torch.randn((1), requires_gradTrue)
target torch.zeros((1))optimizer optim.SGD([weights], lrLR, momentum0.9)# StepLR每隔50轮下降一次学习率
scheduler_lr optim.lr_scheduler.StepLR(optimizer, step_size50, gamma0.1) # 设置学习率下降策略lr_list, epoch_list list(), list()
for epoch in range(max_epoch):# 获取当前lr新版本用 get_last_lr()函数旧版本用get_lr()函数具体看UserWarninglr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, labelStep LR Scheduler)
plt.xlabel(Epoch)
plt.ylabel(Learning rate)
plt.legend()
plt.show()绘制出的结果如图所示 从图中可见每隔50轮学习率下降为原来的0.1倍。
2.MultiStepLR
功能按照给定间隔调整学习率。
torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma0.1, last_epoch-1)参数如下
milestones列表设定调整时刻数必须是递增的。gamma调整系数。
调整方式lr lr * gamma
举个栗子
milestones [50, 125, 160]
scheduler_lr optim.lr_scheduler.MultiStepLR(optimizer, milestonesmilestones, gamma0.1)lr_list, epoch_list list(), list()
for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, labelMulti Step LR Scheduler\nmilestones:{}.format(milestones))
plt.xlabel(Epoch)
plt.ylabel(Learning rate)
plt.legend()
plt.show()结果如下图所示 从图中可见在我们设定的位置50/125/160轮时学习率下降为原来的0.1倍。
3.ExponentialLR
功能按指数衰减调整lr。
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch-1)参数需要关注的只有一个
gamma指数的底。
调整策略lr lr * gamma ^ epoch
举个栗子
gamma 0.95
scheduler_lr optim.lr_scheduler.ExponentialLR(optimizer, gammagamma)lr_list, epoch_list list(), list()
for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, labelExponential LR Scheduler\ngamma:{}.format(gamma))
plt.xlabel(Epoch)
plt.ylabel(Learning rate)
plt.legend()
plt.show()学习率变化结果如下图所示
4.CosineAnnealingLR
功能余弦周期调整lr。
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min0, last_epoch-1)参数如下所示
T_max下降周期注意不是cos的周期是cos周期的一半。eta_min学习率下限默认为0。
调整方式
t_max 50
scheduler_lr optim.lr_scheduler.CosineAnnealingLR(optimizer, T_maxt_max, eta_min0.)lr_list, epoch_list list(), list()
for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)for i in range(iteration):loss torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, labelCosineAnnealingLR Scheduler\nT_max:{}.format(t_max))
plt.xlabel(Epoch)
plt.ylabel(Learning rate)
plt.legend()
plt.show()学习率变化曲线如下图所示 T_max设置为50所以0-50下降50-100上升以此类推。
5.ReduceLRonPlateau
功能监控指标当指标不再变化则调整。
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, modemin, factor0.1, patience10, verboseFalse, threshold0.0001, threshold_moderel, cooldown0, min_lr0, eps1e-08)参数如下所示
modemin/max两种模式。factor调整系数。patience“耐心”接收几次不变化。cooldown“冷却时间”停止监控一段时间。verbose是否打印日志。min_lr学习率下限。eps学习率衰减最小值。
举个栗子
loss_value 0.5
accuray 0.9factor 0.1
mode min
patience 10
cooldown 10
min_lr 1e-4
verbose Truescheduler_lr optim.lr_scheduler.ReduceLROnPlateau(optimizer, factorfactor, modemode, patiencepatience,cooldowncooldown, min_lrmin_lr, verboseverbose)for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()# if epoch 5:# loss_value 0.4scheduler_lr.step(loss_value)结果如下所示
Epoch 12: reducing learning rate of group 0 to 1.0000e-02.
Epoch 33: reducing learning rate of group 0 to 1.0000e-03.
Epoch 54: reducing learning rate of group 0 to 1.0000e-04.6.LambdaLR
功能自定义调整策略。
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch-1)参数主要就一个 lr_lambda函数或list。
举个例子
lr_init 0.1weights_1 torch.randn((6, 3, 5, 5))
weights_2 torch.ones((5, 5))optimizer optim.SGD([{params: [weights_1]},{params: [weights_2]}], lrlr_init)lambda1 lambda epoch: 0.1 ** (epoch // 20)
lambda2 lambda epoch: 0.95 ** epochscheduler torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda[lambda1, lambda2])lr_list, epoch_list list(), list()
for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()scheduler.step()lr_list.append(scheduler.get_lr())epoch_list.append(epoch)print(epoch:{:5d}, lr:{}.format(epoch, scheduler.get_lr()))plt.plot(epoch_list, [i[0] for i in lr_list], labellambda 1)
plt.plot(epoch_list, [i[1] for i in lr_list], labellambda 2)
plt.xlabel(Epoch)
plt.ylabel(Learning Rate)
plt.title(LambdaLR)
plt.legend()
plt.show()结果如下图所示一个是每隔20轮学习率下降为0.1倍一个是指数衰减底为0.95