warmup lr+CosineAnnealingLR策略
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策略相关推荐
- Gradual warmup lr schedule--pytorch
Gradually warm-up(increasing) learning rate for pytorch's optimizer. Proposed in 'Accurate, Large Mi ...
- 【DL】——Warmup学习率调整策略
1. warmup的必要性 原理这部分转载自: 神经网络中 warmup 策略为什么有效:有什么理论解释么? 那么在什么时候可能不成立呢?论文[3]告诉我们有两种情况: 在训练的开始阶段,模型权重迅速 ...
- Pytorch LR scheduler
torch.optim.lr_scheduler 模块提供了一些根据 epoch 迭代次数来调整学习率 lr 的方法.为了能够让损失函数最终达到收敛的效果,通常 lr 随着迭代次数的增加而减小时能够得 ...
- 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 ...
- 常用lr_scheduler总结
0 前言 学习率(learning rate)是网络训练中最重要的超参数之一, 学习率可以控制模型的训练速度, 甚至影响模型的收敛性. 因此一个好的学习率设置是非常重要的. 深度学习炼丹师们日常工作的 ...
- 用Transformer实现OCR字符识别!
Datawhale干货 作者:安晟.袁明坤,Datawhale成员 在CV领域中,transformer除了分类还能做什么?本文将采用一个单词识别任务数据集,讲解如何使用transformer实现一个 ...
- 浅析深度学习中Batch Size大小对训练过程的影响
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨陈志远@知乎(已授权) 来源丨https://zhuanlan ...
- batch size 训练时间_深度学习 | Batch Size大小对训练过程的影响
转自:面试中问你 Batch Size大小对训练过程的影响mp.weixin.qq.com 先看两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可 ...
- 深度学习中 Batch Size 对训练过程的影响
作者 | 陈志远 编辑丨极市平台 之前面试过程中被问到过两个问题: (1)深度学习中batch size的大小对训练过程的影响是什么样的? (2)有些时候不可避免地要用超大batch,比如人脸识别,可 ...
最新文章
- kcf 脊回归 范数
- 禁止用户复制网页的内容
- 后端传给前端 无限极分类_学徒|记者亲身体验垃圾分拣,臭到崩溃!我们还有什么理由不做垃圾分类?...
- Android中通过SeekBar手动控制ProgressBar与模拟下载自动更新进度条
- 程序员,你是真的该养生了
- 删除用户和用户下的所有表
- HTTP Status Code(Http状态码)
- 介绍一下关于Spring Cloud Stream
- 字节跳动:高级人才的五个基本素质
- 杨超越吧编程大赛;拼多多刷单?苹果新员工一半没本科学历 | 极客头条
- C#基础-Func,Action
- Django 1.9官方文档
- 阿贝尔分部求和法的应用(二)
- CnOpenData工商注册企业数量统计数据:省份-年度-企业数量信息表
- 对代码签名另一种认识(下)
- 使用WebSocket实现多组即时对战五子棋
- 物联网之父凯文-阿什顿:物联网世界充斥着人工智能
- eigrp 扩散算法_EIGRP之DUAL(扩散更新算法)
- Hadoop3.3.3完全分布式安装(Centos7.x)(保姆教程)
- 赛迪顾问看好中国信息安全市场稳步发展