热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python里的jh是啥意思_1.Yolov5学习率调整策略_jhsignal的博客CSDN博客

原文作者:jhsignal原文标题:1.Yolov5学习率调整策略发布时间:置顶1.Yolov5学习率调整策略:lr_scheduler.

原文作者:jhsignal

原文标题:1.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[&#39;lr&#39;] = np.interp(ni, xi, [0.1 if j == 2 else 0.0, 0.01 * lf(epoch)])

if &#39;momentum&#39; in x:

x[&#39;momentum&#39;] = np.interp(ni, xi, [0.8, 0.937])

pass # iter and train here

# Scheduler 学习率衰减

lr = [x[&#39;lr&#39;] for x in optimizer.param_groups]

lr0.append(lr[0])

lr1.append(lr[1])

lr2.append(lr[2])

#学习率更新

scheduler.step()

epochs.append(epoch)

plt.figure()

plt.subplot(221)

plt.plot(epochs, lr0, color="r",label=&#39;l0&#39;)

plt.legend()

plt.subplot(222)

plt.plot(epochs, lr1, color="b",label=&#39;l1&#39;)

plt.legend()

plt.subplot(223)

plt.plot(epochs, lr2,color="g",label=&#39;l2&#39;)

plt.legend()

plt.show()

如下图所示我分别绘制出训练100个epoch时的学习率变化情况。

d0ed203d686e72f003243d03b5f9b354.gif

2.余弦退火算法

如果想看懂上面的学习率调整算法,我们得需要理解余弦退火算法,它的公式和解释如下:

n

e

w

l

r

=

e

t

a

m

i

n

+

(

i

n

i

t

i

a

l

l

r

e

t

a

m

i

n

)

(

(

1

+

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

)

/

2

)

new_-lr=eta_-min+(initial_-lr-eta_-min)*((1+cos(\frac{cur_-epoch}{T_-max}*\pi ))/2)

new−​lr=eta−​min+(initial−​lr−eta−​min)∗((1+cos(T−​maxcur−​epoch​∗π))/2)

new_-lr:新得到的学习率。

initial_lr:初始学习率。

eta_min:表示最小学习率。

cur_epoch:代表当前训练到某个epoch对应的值。

T_max: 代表训练的总epoch数。

last_epoch:最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

比如当我们initial_-lr为0.01,eta_-min为0.002,epoch为200,T_max为也就是200时,可以绘制如下的学习率图。

d0ed203d686e72f003243d03b5f9b354.gif

余弦退火函数的深度剖析:

那么这个函数的具体含义是什么呢?它的结构为什么是这个形式呢?其实只看函数很简单,它就是由一个余弦函数cos和一些简单的加法乘法组合而成,接下来我来深度剖析这个函数的具体含义:

为了方便计算和展示函数的意义,假设初始学习率为1,最小学习率为0.2。我们一层一层的对函数进行解析,它的内部是cos函数,而cos函数的取值范围为[-1,1]。

我们绘制出

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

cos(\frac{cur_-epoch}{T_-max}*\pi )

cos(T−​maxcur−​epoch​∗π)的曲线如图一所示:

(

1

+

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

)

(1+cos(\frac{cur_-epoch}{T_-max}*\pi ))

(1+cos(T−​maxcur−​epoch​∗π))函数的曲线如图2所示:

(

(

1

+

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

)

/

2

)

((1+cos(\frac{cur_-epoch}{T_-max}*\pi ))/2)

((1+cos(T−​maxcur−​epoch​∗π))/2)函数的曲线绘制如图3所示:

(

i

n

i

t

i

a

l

l

r

e

t

a

m

i

n

)

(

(

1

+

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

)

/

2

)

(initial_-lr-eta_-min)*((1+cos(\frac{cur_-epoch}{T_-max}*\pi ))/2)

(initial−​lr−eta−​min)∗((1+cos(T−​maxcur−​epoch​∗π))/2)如图4所示:

e

t

a

m

i

n

+

(

i

n

i

t

i

a

l

l

r

e

t

a

m

i

n

)

(

(

1

+

c

o

s

(

c

u

r

e

p

o

c

h

T

m

a

x

π

)

)

/

2

)

eta_-min+(initial_-lr-eta_-min)*((1+cos(\frac{cur_-epoch}{T_-max}*\pi ))/2)

eta−​min+(initial−​lr−eta−​min)∗((1+cos(T−​maxcur−​epoch​∗π))/2)如图5所示。

d0ed203d686e72f003243d03b5f9b354.gif

就这么简单,我们一步一步的解刨了函数的具体含义,接下类我们来解析一下预热过程中所使用的线性插值方法来更新学习率

3. 一维线性插值:np.interp(x**,** xp**,** fp)

它的定义是将一维分段线性插值返回给具有给定离散数据点(xp,fp)且在x处求值的函数。

x:待插入数据的横坐标.

xp:原始数据点的横坐标

fp:原始数据点的y坐标,与xp的长度相同。

返回值

浮点数或复数(对应于fp值)或ndarray. 插入数据的纵坐标,和x形状相同。

例1:可以看到当x=2.5的时候,得到的y值是1。

import numpy as np

import matplotlib.pyplot as plt

x = 2.5

xp = [1, 2, 3]

fp = [3, 2, 0]

y = np.interp(x, xp, fp) # 1.0

plt.plot(xp, fp,&#39;ro&#39;)

plt.plot(x, y, &#39;x&#39;)

plt.show()

如下图所示,其中蓝色的点是插值后的点。

d0ed203d686e72f003243d03b5f9b354.gif

例2:在红色的十个点之间进行插入50个蓝色标记的点如下所示:

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 10)

y = np.sin(x)

xvals = np.linspace(0, 2 * np.pi, 50)

yinterp = np.interp(xvals, x, y)

plt.plot(x, y, &#39;ro&#39;)

plt.plot(xvals, yinterp, &#39;x&#39;)

plt.show()

d0ed203d686e72f003243d03b5f9b354.gif

Post Views:

41



推荐阅读
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了Python函数的定义与调用的方法,以及函数的作用,包括增强代码的可读性和重用性。文章详细解释了函数的定义与调用的语法和规则,以及函数的参数和返回值的用法。同时,还介绍了函数返回值的多种情况和多个值的返回方式。通过学习本文,读者可以更好地理解和使用Python函数,提高代码的可读性和重用性。 ... [详细]
author-avatar
Angkaka
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有