1.Yolov5学习率调整策略

Yolov5学习率调整策略与余弦退火算法解析
该文章已生成可运行项目,

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)]
本文章已经生成可运行项目
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值