前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >余弦退火重启动学习率机制

余弦退火重启动学习率机制

作者头像
BBuf
发布2021-10-08 14:52:53
1.6K0
发布2021-10-08 14:52:53
举报
文章被收录于专栏:GiantPandaCVGiantPandaCV

余弦退火重启动学习率机制

【导语】主要介绍在pytorch 中实现了余弦退火重启动学习率机制,支持 warmup 和 resume 训练。并且支持自定义下降函数,实现多种重启动机制。

代码:https://github.com/Huangdebo/CAWB

1. 多 step 重启动

设定 cawb_steps 之后,便可实现多步长余弦退火重启动学习率机制;调整epoch_scale可以实现更复杂的变化机制

设定 cawb_steps 之后,便可实现多步长余弦退火重启动学习率机制。每次重启动时,开始学习率会乘上一个比例因子 step_scale。调整 step_scale 和 epoch_scale 等参数,可以实现学习率跳变的时候是上升还是下降。也可以调整中间的 step 不用走完一个退火过程,保持较高的学习率,实现更复杂的学习率变化机制。

2. 正常余弦退火机制

如果 cawb_steps 为 [], 则会实现正常的余弦退火机制

如果 cawb_steps 为 [], 则会实现正常的余弦退火机制,在整个 epochs 中按设定的 lf 机制一直下降

3. warmup

设定 warmup_epoch 之后便可实现学习率的 warmup 机制

设定 warmup_epoch 之后便可实现学习率的 warmup 机制。warmup_epoch 结束后则按设定的 cawb_steps 实现重启动退火机制。

4. resume

设定 last_epoch 便可实现 resume 训练

设定 last_epoch 便可实现 resume 训练,接上之前中断的训练中的学习率。

5. 自定义下降函数

自定义下降函数

可通过自定义下降函数,实现多种重启动机制

代码语言:javascript
复制
# lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.9 + 0.1  
lf = lambda x, y=opt.epochs: (1.0 - (x / y)) * 0.8 + 0.2 
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, step_scale=0.7, 
                                         steps=opt.cawb_steps, lf=lf, batchs=len(data), warmup_epoch=0)

6. 实验结果

本实验是在 COCO2017中随机选出 10000 图像和 1000 张图像分别作为训练集和验证集。检测网络使用 yolov5s,学习率调整机制分别原版的 cos 和 本文实现的 CAWB。

6.1 学习率:
代码语言:javascript
复制
# yolov5
lf = lambda x: ((1 - math.cos(x * math.pi / steps)) / 2) * (y2 - y1) + y1
scheduler = lr_scheduler.LambdaLR(optimizer, lr_lambda=lf)

# 本文
lf = lambda x, y=opt.epochs: (((1 + math.cos(x * math.pi / y)) / 2) ** 1.0) * 0.65 + 0.35 
scheduler = CosineAnnealingWarmbootingLR(optimizer, epochs=opt.epochs, steps=opt.cawb_steps, step_scale=0.7,
                                         lf=lf, batchs=len(train_loader), warmup_epoch=3, epoch_scale=4.0)

cos 和 cawb 学习率

6.2 map:
6.2.1 cos:

mAP_0.5 = 0.294; mAP_0.5:0.95 = 0.161

mAP_0.5 = 0.294; mAP_0.5:0.95 = 0.161

6.2.2 CAWB :

mAP_0.5 = 0.302; mAP_0.5:0.95 = 0.165

mAP_0.5 = 0.302; mAP_0.5:0.95 = 0.165

7. 结论

在实验中使用了 CAWB 学习率机制时候,mAP_0.5 和 mAP_0.5:0.95 都提升了一丢丢,而且上升趋势更加明显,增加 epochs 可能提升更大。

改变 CAWB 的参数可以实现更多形式的学习率变化机制。增加学习率突变就是想增加网络跳出局部最优的概率,所以不同数据集可能合适不同的变化机制。小伙伴们在其他数据集上尝试之后,记得来提个 issue 哈...

代码:https://github.com/Huangdebo/CAWB

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GiantPandaCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 余弦退火重启动学习率机制
    • 1. 多 step 重启动
      • 2. 正常余弦退火机制
        • 3. warmup
          • 4. resume
            • 5. 自定义下降函数
              • 6. 实验结果
              • 7. 结论
              相关产品与服务
              对象存储
              对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档