1.Yolov5学习率调整策略:lr_scheduler.LambdaLR
本代码模拟yolov5的学习率调整,深度解析其中torch.optim.lr_scheduler在yolov5的使用方法,有助于提高我们对该代码的理解。
为了简单实现模拟yolov5的学习率调整策略,在此代码中我使用resnet18网络,yolov5则使用的是darknet网络骨架。
在yolov5代码训练的过程中,作者对不同的层使用不同的学习率调整方法,分别分为权重层weight,偏执层bais,和BN层,单独调整不同层的学习率可以使得模型训练的更好。
另外,yolov5在对学习率更新也采用了warmp-up的的方法预热学习率。在warmp-up阶段,采用的是一维线性插值来进行对每次迭代的学习率进行更新,在warmp-up阶段以后采用的余弦退火算法来对学习率进行更新。所以接下来我们会分别详细介绍一下代码的组成以及其中所用到的方法:
如下是我模拟yolov5训练代码学习率调整的方法:
1.我定义了训练的总epoch是100,样本总数量是600个,训练的batch_size是20。
import matplotlib.pyplot as plt
import torch
import torch.optim as optim
from torch.optim.lr_scheduler import LambdaLR
from torchvision.models import resnet18
import seaborn as sns
import math
import torch.nn as nn
import numpy as np
num_epochs = 100
nums = 600
batch_size = 20
n = nums/batch_size
#定义10分类网络
model = resnet18(num_classes=10)
# optimizer parameter groups 设置了个优化组:权重,偏置,其他参数
pg0, pg1, pg2 = [], [], []
for k, v in model.named_parameters():
v.requires_grad = True
if '.bias' in k:
pg2.append(v) # biases
elif '.weight' in k and '.bn' not in k:
pg1.append(v) # apply weight decay
else:
pg0.append(v) # all else
optimizer = optim.SGD(pg0, lr=0.01,momentum=0.937, nesterov=True)
#给optimizer管理的参数组中增加新的组参数,
#可为该组参数定制lr,momentum,weight_decay 等在finetune 中常用。
optimizer.add_param_group({
'params': pg1,'weight_decay':0.0005 }) # add pg2 (biases)
optimizer.add_param_group({
'params': pg2}) # add pg2 (biases)
lf = lambda x: ((1 + math.cos(x * math.pi / num_epochs)) / 2) * (1 - 0.2) + 0.2
scheduler = LambdaLR(
optimizer=optimizer,
lr_lambda=lf, #传入一个函数或一个以函数为元素列表,作为学习率调整的策略
)
start_epoch=0
scheduler.last_epoch = start_epoch - 1
lr0,lr1,lr2, epochs = [], [], [] ,[]
optimizer.zero_grad()
for epoch in range(start_epoch,num_epochs):
for i in range(n):
#训练的迭代次数
ni = i + n * epoch
# Warmup 热身的迭代次数
if ni <= 1000:
xi = [0, 1000]
for j, x in enumerate(optimizer.param_groups):
#一维线性插值
x['lr'] = np.interp(ni, xi, [0.1 if j == 2 else 0.0, 0.01 * lf(epoch)]

最低0.47元/天 解锁文章
2405





