目标检测的Tricks | 【Trick5】学习率调优方法——warmup
如有错误,恳请指出。
文章目录
- 1. warmup理论概要
- 2. warmup实现代码
1. warmup理论概要
warmup定义:
在模型训练之初选用较小的学习率,训练一段时间之后(如:10epoches或10000steps)使用预设的学习率进行训练。
warmup作用:
- 因为模型的weights是随机初始化的,可以理解为训练之初模型对数据的“理解程度”为0(即:没有任何先验知识),在第一个epoches中,每个batch的数据对模型来说都是新的,模型会根据输入的数据进行快速调参,此时如果采用较大的学习率的话,有很大的可能使模型对于数据“过拟合”(“学偏”),后续需要更多的轮次才能“拉回来”;
- 当模型训练一段时间之后(如:10epoches或10000steps),模型对数据具有一定的先验知识,此时使用较大的学习率模型就不容易学“偏”,可以使用较大的学习率加速模型收敛;
- 当模型使用较大的学习率训练一段时间之后,模型的分布相对比较稳定,此时不宜从数据中再学到新特点,如果仍使用较大的学习率会破坏模型的稳定性,而使用小学习率更容易获取local optima。
warmup类型:
Constant Warmup
学习率从非常小的数值线性增加到预设值之后保持不变,其学习率的系数如下图所示:
Linner Warmup
学习率从非常小的数值线性增加到预设值之后,然后再线性减小。其学习率的系数如下图所示:
Cosine Warmup
学习率先从很小的数值线性增加到预设学习率,然后按照cos函数值进行衰减。其学习率系数如下图所示:
Gradual Warmup
constant warmup的不足之处在于从一个很小的学习率一下变为比较大的学习率可能会导致训练误差突然增大。于是18年Facebook提出了gradual warmup来解决这个问题,即从最初的小学习率开始,每个step增大一点点,直到达到最初设置的比较大的学习率时,采用最初设置的学习率进行训练。
gradual warmup的实现模拟代码如下:
"""
Implements gradual warmup, if train_steps < warmup_steps, the
learning rate will be `train_steps/warmup_steps * init_lr`.
Args:warmup_steps:warmup步长阈值,即train_steps<warmup_steps,使用预热学习率,否则使用预设值学习率train_steps:训练了的步长数init_lr:预设置学习率
"""
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline warmup_steps = 2500
init_lr = 0.1
# 模拟训练15000步
max_steps = 15000
learning_rate_lists = []
for train_steps in range(max_steps):if warmup_steps and train_steps < warmup_steps:warmup_percent_done = train_steps / warmup_stepswarmup_learning_rate = init_lr * warmup_percent_done #gradual warmup_lrlearning_rate = warmup_learning_rateelse:
# learning_rate = np.sin(learning_rate) #预热学习率结束后,学习率呈sin衰减learning_rate = learning_rate**1.0001 #预热学习率结束后,学习率呈指数衰减(近似模拟指数衰减)
# if (train_steps+1) % 100 == 0:
# print("train_steps:%.3f--warmup_steps:%.3f--learning_rate:%.3f" % (
# train_steps+1,warmup_steps,learning_rate))learning_rate_lists.append(learning_rate)plt.figure(figsize=(15, 4))
plt.plot(range(max_steps), learning_rate_lists)
2. warmup实现代码
YOLOv3-SPP代码:
def warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor):def f(x):"""根据step数返回一个学习率倍率因子"""if x >= warmup_iters: # 当迭代数大于给定的warmup_iters时,倍率因子为1return 1alpha = float(x) / warmup_iters# 迭代过程中倍率因子从warmup_factor -> 1return warmup_factor * (1 - alpha) + alphareturn torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=f)# 训练一个epoch
def train_one_epoch(model, optimizer, data_loader, device, epoch,print_freq, accumulate, img_size,grid_min, grid_max, gs,multi_scale=False, warmup=False, scaler=None):...lr_scheduler = Noneif epoch == 0 and warmup is True: # 当训练第一轮(epoch=0)时,启用warmup训练方式,可理解为热身训练warmup_factor = 1.0 / 1000warmup_iters = min(1000, len(data_loader) - 1)lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor)accumulate = 1...if ni % accumulate == 0 and lr_scheduler is not None: # 第一轮使用warmup训练方式lr_scheduler.step()# 训练过程
def train(hyp):...# optimizerpg = [p for p in model.parameters() if p.requires_grad]optimizer = optim.SGD(pg, lr=hyp["lr0"], momentum=hyp["momentum"],weight_decay=hyp["weight_decay"], nesterov=True)...# Scheduler https://arxiv.org/pdf/1812.01187.pdflf = lambda x: ((1 + math.cos(x * math.pi / epochs)) / 2) * (1 - hyp["lrf"]) + hyp["lrf"] # cosinescheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)scheduler.last_epoch = start_epoch # 指定从哪个epoch开始...for epoch in range(start_epoch, epochs):mloss, lr = train_util.train_one_epoch(model, optimizer, train_dataloader,device, epoch,accumulate=accumulate, # 迭代多少batch才训练完64张图片img_size=imgsz_train, # 输入图像的大小multi_scale=multi_scale,grid_min=grid_min, # grid的最小尺寸grid_max=grid_max, # grid的最大尺寸gs=gs, # grid step: 32print_freq=50, # 每训练多少个step打印一次信息warmup=True,scaler=scaler)# update schedulerscheduler.step()
ps:这里的学习率调度是呈余弦变换,这里我可视化了一下学习率曲线,其按epochs来进行变换,也就是横坐标表示epochs。
可视化代码如下所示:
# epochs: 30
# hyp["lrf"]: 0.01
# x:当前的epoch
lf = lambda x: ((1 + math.cos(x * math.pi / 30)) / 2) * (1 - 0.01) + 0.01plt.figure(figsize=(15, 4))
max_steps = 100
# x = range(max_steps)
y = [lf(x) for x in range(max_steps)]
plt.plot(range(max_steps), y)
yolov3中的学习率变化曲线:
参考资料:
https://blog.csdn.net/qq_38253797/article/details/116451541
目标检测的Tricks | 【Trick5】学习率调优方法——warmup相关推荐
- 【转】调优方法——warmup
学习率是模型训练中最重要的超参之一,针对学习率的优化有很多种方法,而warmup是其中重要的一种. 1. 什么是warmup warmup是一种学习率优化方法(最早出现在ResNet论文中).在模型训 ...
- 机器学习模型调优方法(过拟合、欠拟合、泛化误差、集成学习)
机器学习模型调优方法 过拟合和欠拟合 降低过拟合风险的方法 降低欠拟合风险的方法 泛化误差.偏差和方差 泛化误差 偏差和误差 模型评估 Holdout检验 交叉检验 自助法 集成学习 Boosting ...
- mysql port range_MySQL 数据库常见调优方法及参数设置_MySQL
1. 关闭 SELinux vim /etc/selinux/config 更改 SELINUX=enforcing 为 SELINUX=disabled 2. 更改 IO Schedule, 对于 ...
- 目标检测的Tricks | 【Trick9】nms非极大值抑制处理(包括变体merge-nms、and-nms、soft-nms、diou-nms等介绍)
如有错误,恳请指出. 用这篇博客记录一下nms,也就是非极大值抑制处理,算是目标检测后处理的一个难点. 在训练阶段是不需要nms处理的,只有在验证或者是测试阶段才需要将预测结果进行非极大值抑制处理,来 ...
- AI大视觉(二十) | 小目标检测的tricks汇总
本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 在计算机视觉中,检测小目标是最有挑战的问题之一. 本文汇总了一些有效的策略. 为何小目标 ...
- 目标检测的Tricks | 【Trick8】数据增强——随机旋转、平移、缩放、错切、hsv增强
如有错误,恳请指出. 在之前使用opencv就介绍使用过一些常用的数据增强的实现方法,见:<数据增强 | 旋转.平移.缩放.错切.HSV增强>,当时介绍了旋转.平移.缩放.错切.HSV增强 ...
- 【调优方法】——warmup
学习率是模型训练中最重要的超参之一,针对学习率的优化有很多种方法,而warmup是其中重要的一种. 1. 什么是warmup warmup是一种学习率优化方法(最早出现在ResNet论文中).在模型训 ...
- 目标检测:采用卡尔曼滤波、 帧差法 、三帧差法、 背景差分法、 meansift算法
本程序主要包含五个算法 卡尔曼滤波. 帧差法 .三帧差法. 背景差分法. meansift算法的目标追踪跟进 并用Gui进行了系统的设计和更新 Mansift主要根据第一个数据的设计 得到目标框,然后 ...
- oracle性能调优总结,Oracle的调优方法总结
根据自己项目在使用Oracle中的经验,及Oracle参考手册,对于oracle的调优方法一点点的总结. 以后的篇幅会讨论表空间和数据文件的建立对Oracle并发的影响.本文只是讨论SGA和PGA和S ...
最新文章
- Web后台服务开发——数据库查询之引入TypeORM
- vb字符串在内存中的分布?
- C语言试题二十二之定义了3×3的二维数组,并在主函数中赋值。函数的功能使求出数组周边元素的平均值并作为函数值返回给主函数中的s。
- jenkins pipeline api获取stage的详细信息_Jenkins + Docker 助力 Serverless 应用构建与部署...
- c语言注释参与程序设计的编译,提高C语言程序设计教学的有益探索
- 建立单链表 单链表的插入_单链列表插入
- 本周Web2.0小工具推荐[2008-08-24]
- outlook阅读html,Outlook HTML邮件中英文混排字体设置
- 【PL/SQL】PL/SQL介绍
- PHP之SimpleXML函数
- JavaScript面向对象详解
- 计算机组成原理唐朔飞重点,计算机组成原理唐朔飞高分笔记
- java Swing+mysql实现的家庭收支管理系统(个人收支录入和查询)
- 【指纹识别】基于MATLAB/FPGA的指纹识别算法仿真实现
- 对比MIUI7和Flyme4.5 期待神秘的Flyme5
- 笔记本无网络计算机,win10笔记本电脑连接wifi显示无internet的详细处理方法
- DevExpress中实现给GridControl下的GridView表格修改指定行、列的背景颜色和获取选择行的信息
- mac,macbook 连接蓝牙耳机播放音乐断断续续
- 微信 qq微博分享功能
- 继续啃书,包,触发器