warmup lr策略就是在网络训练初期用比较小的学习率,线性增长到初始设定的学习率。

大概就是下面这个趋势,从0上升到0.01,再按照正常的学习率调整策略训练。

import torch
from torch.optim.lr_scheduler import _LRSchedulerclass WarmUpLR(_LRScheduler):"""warmup_training learning rate schedulerArgs:optimizer: optimzier(e.g. SGD)total_iters: totoal_iters of warmup phase"""def __init__(self, optimizer, total_iters, last_epoch=-1):self.total_iters = total_iterssuper().__init__(optimizer, last_epoch)def get_lr(self):"""we will use the first m batches, and set the learningrate to base_lr * m / total_iters"""return [base_lr * self.last_epoch / (self.total_iters + 1e-8) for base_lr in self.base_lrs]

重点:warmup_scheduler = WarmUpLR(optimizer, iter_per_epoch * args.warm),这句话里的iter_per_epoch * args.warm决定了你要将warmlr更新在哪里。

如果是WarmUpLR(optimizer, args.warm),说明你要用args.warm个epoch上升到初始学习率,那warmup lr就要放在epoch里step。

    params = split_weights(net)optimizer = optim.SGD(params, lr=args.lr, momentum=0.9, weight_decay=1e-4, nesterov=True)#set up warmup phase learning rate scheduleriter_per_epoch = len(train_dataloader)warmup_scheduler = WarmUpLR(optimizer, args.warm)#set up training phase learning rate schedulertrain_scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=settings.MILESTONES)#train_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, args.e - args.warm)best_acc = 0.0for epoch in range(1, args.e + 1):if epoch < args.warm:warmup_scheduler.step()if epoch > args.warm:train_scheduler.step(epoch)#training procedurenet.train()for batch_index, (images, labels) in enumerate(train_dataloader):

如果是WarmUpLR(optimizer, iter_per_epoch * args.warm),说明你要用args.warm*iter_per_epoch个step上升到初始学习率,那warmup lr就要放在batch里step。

    params = split_weights(net)optimizer = optim.SGD(params, lr=args.lr, momentum=0.9, weight_decay=1e-4, nesterov=True)#set up warmup phase learning rate scheduleriter_per_epoch = len(train_dataloader)warmup_scheduler = WarmUpLR(optimizer, iter_per_epoch * args.warm)#set up training phase learning rate schedulertrain_scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=settings.MILESTONES)#train_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, args.e - args.warm)best_acc = 0.0for epoch in range(1, args.e + 1):if epoch > args.warm:# 直接写epoch就行 延续self.last_epoch接着计数train_scheduler.step(epoch)#training procedurenet.train()for batch_index, (images, labels) in enumerate(train_dataloader):if epoch <= args.warm:warmup_scheduler.step()

初始化了train_scheduler和warmup_scheduler,二者都继承了父类_LRScheduler。

如果是下面这种情况,warmup初始化了,但是没有调用,scheduler.step()的学习率就一直是0。解决方法:1)把scheduler的初始化放在warmup_scheduler后面;2)scheduler.step(epoch),直接写入epoch参数。

猜测原因:1)与last_epoch有关;2)与get_lr有关;3)与iters有关。

    scheduler = lr_scheduler.CosineAnnealingLR(optimizer, epochs)warmup_scheduler = WarmUpLR(optimizer, warmup_epoch * iter_per_epoch)for epoch in range(0, epochs):if epoch >= 0:#scheduler.step(epoch - warmup_epoch)logger.info("Epoch: {}/{}".format(epoch, epochs))scheduler.step()learn_rate = scheduler.get_lr()logger.info("Learn_rate:%s" % learn_rate)

关注self.last_epoch

class _LRScheduler(object):def __init__(self, optimizer, last_epoch=-1):if not isinstance(optimizer, Optimizer):raise TypeError('{} is not an Optimizer'.format(type(optimizer).__name__))self.optimizer = optimizerif last_epoch == -1:for group in optimizer.param_groups:group.setdefault('initial_lr', group['lr'])else:for i, group in enumerate(optimizer.param_groups):if 'initial_lr' not in group:raise KeyError("param 'initial_lr' is not specified ""in param_groups[{}] when resuming an optimizer".format(i))self.base_lrs = list(map(lambda group: group['initial_lr'], optimizer.param_groups))self.step(last_epoch + 1)self.last_epoch = last_epochdef get_lr(self):raise NotImplementedErrordef step(self, epoch=None):if epoch is None:epoch = self.last_epoch + 1self.last_epoch = epochfor param_group, lr in zip(self.optimizer.param_groups, self.get_lr()):param_group['lr'] = lr

warmup lr+CosineAnnealingLR策略相关推荐

  1. Gradual warmup lr schedule--pytorch

    Gradually warm-up(increasing) learning rate for pytorch's optimizer. Proposed in 'Accurate, Large Mi ...

  2. 【DL】——Warmup学习率调整策略

    1. warmup的必要性 原理这部分转载自: 神经网络中 warmup 策略为什么有效:有什么理论解释么? 那么在什么时候可能不成立呢?论文[3]告诉我们有两种情况: 在训练的开始阶段,模型权重迅速 ...

  3. Pytorch LR scheduler

    torch.optim.lr_scheduler 模块提供了一些根据 epoch 迭代次数来调整学习率 lr 的方法.为了能够让损失函数最终达到收敛的效果,通常 lr 随着迭代次数的增加而减小时能够得 ...

  4. Warm-up pytorch代码

    train_cfg = dict(warmup = 5,lr = [0.004, 0.002, 0.0004, 0.00004, 0.000004],gamma = 0.1,end_lr = 1e-6 ...

  5. 常用lr_scheduler总结

    0 前言 学习率(learning rate)是网络训练中最重要的超参数之一, 学习率可以控制模型的训练速度, 甚至影响模型的收敛性. 因此一个好的学习率设置是非常重要的. 深度学习炼丹师们日常工作的 ...

  6. 用Transformer实现OCR字符识别!

    Datawhale干货 作者:安晟.袁明坤,Datawhale成员 在CV领域中,transformer除了分类还能做什么?本文将采用一个单词识别任务数据集,讲解如何使用transformer实现一个 ...

  7. 浅析深度学习中Batch Size大小对训练过程的影响

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨陈志远@知乎(已授权) 来源丨https://zhuanlan ...

  8. batch size 训练时间_深度学习 | Batch Size大小对训练过程的影响

    转自:面试中问你 Batch Size大小对训练过程的影响​mp.weixin.qq.com 先看两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可 ...

  9. 深度学习中 Batch Size 对训练过程的影响

    作者 | 陈志远 编辑丨极市平台 之前面试过程中被问到过两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可避免地要用超大batch,比如人脸识别,可 ...

最新文章

  1. kcf 脊回归 范数
  2. 禁止用户复制网页的内容
  3. 后端传给前端 无限极分类_学徒|记者亲身体验垃圾分拣,臭到崩溃!我们还有什么理由不做垃圾分类?...
  4. Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条
  5. 程序员,你是真的该养生了
  6. 删除用户和用户下的所有表
  7. HTTP Status Code(Http状态码)
  8. 介绍一下关于Spring Cloud Stream
  9. 字节跳动:高级人才的五个基本素质
  10. 杨超越吧编程大赛;拼多多刷单?苹果新员工一半没本科学历 | 极客头条
  11. C#基础-Func,Action
  12. Django 1.9官方文档
  13. 阿贝尔分部求和法的应用(二)
  14. CnOpenData工商注册企业数量统计数据:省份-年度-企业数量信息表
  15. 对代码签名另一种认识(下)
  16. 使用WebSocket实现多组即时对战五子棋
  17. 物联网之父凯文-阿什顿:物联网世界充斥着人工智能
  18. eigrp 扩散算法_EIGRP之DUAL(扩散更新算法)
  19. Hadoop3.3.3完全分布式安装(Centos7.x)(保姆教程)
  20. 赛迪顾问看好中国信息安全市场稳步发展

热门文章

  1. 微信小程序【网易云音乐实战】(第六篇 歌曲搜索、自定义模板、分包)
  2. 一种使用内存做硬盘的方法,提升读写速度
  3. 开发者七问七答:什么是产品化?
  4. python+django+layUI+MySQL+TSC打印机搭建4G设备管理平台项目(二)——过程中的难点记录
  5. 关于微信小程序在部分PC设备无法打开的问题
  6. 怎么制作一张5M以上的大图片
  7. 《计算机网络与因特网》复习纲要
  8. 冈萨雷斯《数字图像处理matlab版》(一):绪言
  9. 第五部分 项目进度管理
  10. html做坦克大战的效果,HTML5实现坦克大战(一)