深度炼丹如同炖排骨一般,需要先大火全局加热,紧接着中火炖出营养,最后转小火收汁。
本文给出炼丹中的 “火候控制器”-- 学习率的几种调节方法,框架基于 pytorch

1. 自定义根据 epoch 改变学习率。

这种方法在开源代码中常见,此处引用 pytorch 官方实例中的代码 adjust_lr

  1. def adjust_learning_rate(optimizer, epoch):
  2. """Sets the learning rate to the initial LR decayed by 10 every 30 epochs"""
  3. lr = args.lr * (0.1 ** (epoch // 30))
  4. for param_group in optimizer.param_groups:
  5. param_group['lr'] = lr

注释:在调用此函数时需要输入所用的 optimizer 以及对应的 epoch ,并且 args.lr 作为初始化的学习率也需要给出。

使用代码示例:

  1. optimizer = torch.optim.SGD(model.parameters(),lr = args.lr,momentum = 0.9)
  2. for epoch in range(10):
  3. adjust_learning_rate(optimizer,epoch)
  4. train(...)
  5. validate(...)

2. 针对模型的不同层设置不同的学习率

当我们在使用预训练的模型时,需要对分类层进行单独修改并进行初始化,其他层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除分类层以外的层只进行微调,不需要过多改变参数,因此需要设置较小的学习率。而改正后的分类层则需要以较大的步子去收敛,学习率往往要设置大一点以 resnet101 为例,分层设置学习率。

  1. model = torchvision.models.resnet101(pretrained=True)
  2. large_lr_layers = list(map(id,model.fc.parameters()))
  3. small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
  4. optimizer = torch.optim.SGD([
  5. {"params":large_lr_layers},
  6. {"params":small_lr_layers,"lr":1e-4}
  7. ],lr = 1e-2,momenum=0.9)

注:large_lr_layers 学习率为 1e-2,small_lr_layers 学习率为 1e-4,两部分参数共用一个 momenum

3. 根据具体需要改变 lr

以前使用 keras 的时候比较喜欢 ReduceLROnPlateau 可以根据 损失或者 准确度的变化来改变 lr。最近发现 pytorch 也实现了这一个功能。

  1. class torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode='rel', cooldown=0, min_lr=0, eps=1e-08)

以 acc 为例,当 mode 设置为 “max” 时,如果 acc 在给定 patience 内没有提升,则以 factor 的倍率降低 lr。

使用方法示例:

  1. optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
  2. scheduler = ReduceLROnPlateau(optimizer, 'max',verbose=1,patience=3)
  3. for epoch in range(10):
  4. train(...)
  5. val_acc = validate(...)
  6. # 降低学习率需要在给出 val_acc 之后
  7. scheduler.step(val_acc)

4. 手动设置 lr 衰减区间

使用方法示例

  1. def adjust_learning_rate(optimizer, lr):
  2. for param_group in optimizer.param_groups:
  3. param_group['lr'] = lr
  4. for epoch in range(60):
  5. lr = 30e-5
  6. if epoch > 25:
  7. lr = 15e-5
  8. if epoch > 30:
  9. lr = 7.5e-5
  10. if epoch > 35:
  11. lr = 3e-5
  12. if epoch > 40:
  13. lr = 1e-5
  14. adjust_learning_rate(optimizer, lr)

5. 余弦退火

论文: SGDR: Stochastic Gradient Descent with Warm Restarts

使用方法示例

  1. epochs = 60
  2. optimizer = optim.SGD(model.parameters(),lr = config.lr,momentum=0.9,weight_decay=1e-4)
  3. scheduler = lr_scheduler.CosineAnnealingLR(optimizer,T_max = (epochs // 9) + 1)
  4. for epoch in range(epochs):
  5. scheduler.step(epoch)

目前最常用的也就这么多了,当然也有很多其他类别,详情见 how-to-adjust-learning-rate

参考文献

标签: pytorch

pytorch 动态调整学习率 重点的更多相关文章

  1. pytorch识别CIFAR10:训练ResNet-34(自定义transform,动态调整学习率,准确率提升到94.33%)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 前面通过数据增强,ResNet-34残差网络识别CIFAR10,准确率达到了92.6. 这里对训练过程 ...

  2. pytorch中调整学习率的lr_scheduler机制

    有的时候需要我们通过一定机制来调整学习率,这个时候可以借助于torch.optim.lr_scheduler类来进行调整:一般地有下面两种调整策略:(通过两个例子来展示一下) 两种机制:LambdaL ...

  3. [pytorch笔记] 调整网络学习率

    1. 为网络的不同部分指定不同的学习率 class LeNet(t.nn.Module): def __init__(self): super(LeNet, self).__init__() self ...

  4. 【转载】 Pytorch中的学习率调整lr_scheduler,ReduceLROnPlateau

    原文地址: https://blog.csdn.net/happyday_d/article/details/85267561 ------------------------------------ ...

  5. pytorch中的学习率调整函数

    参考:https://pytorch.org/docs/master/optim.html#how-to-adjust-learning-rate torch.optim.lr_scheduler提供 ...

  6. Pytorch调整学习率

    每隔一定的epoch调整学习率 def adjust_learning_rate(optimizer, epoch): """Sets the learning rate ...

  7. 在 Web 级集群中动态调整 Pod 资源限制

    作者阿里云容器平台技术专家 王程阿里云容器平台技术专家 张晓宇(衷源) ## 引子 不知道大家有没有过这样的经历,当我们拥有了一套 Kubernetes 集群,然后开始部署应用的时候,我们应该给容器分 ...

  8. 动态线程池(DynamicTp)之动态调整Tomcat、Jetty、Undertow线程池参数篇

    大家好,这篇文章我们来介绍下动态线程池框架(DynamicTp)的adapter模块,上篇文章也大概介绍过了,该模块主要是用来适配一些第三方组件的线程池管理,让第三方组件内置的线程池也能享受到动态参数 ...

  9. 如何实现可动态调整隐藏header的listview

    (转自:http://blog.sina.com.cn/s/blog_70b9730f01014sgm.html) 需求:根据某种需要,可能需要动态调整listview的页眉页脚,譬如将header作 ...

随机推荐

  1. day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    package cn.itcast.test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate. ...

  2. thinkcmf 导航高亮制作方法(适用于多级导航)(通用)

    平时用thinkcmf网站开发经常需要导航点击之后高亮,就写了一些实现方法分享一下. 思路很简单,先获取当前页面的顶级栏目的地址,然后与导航中的地址比较,相同的就加上一个class,把下面函数理解了不 ...

  3. NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎

    NoSQL最早起源于1998年,但从2009年开始,NoSQL真正开始逐渐兴起和发展.回望历史应该说NoSQL数据库的兴起,完全是十年来伴随互联网技术,大数据数据的兴起和发展,NoSQL在面临大数据场 ...

  4. Django项目:CRM(客户关系管理系统)--15--07PerfectCRM实现King_admin显示注册的表01

    <th ><a href="/kingadmin/{% get_app_name admin_class.model %}/{% get_model_name admin_ ...

  5. node安装镜像和webpack

    先安装node 安装指南:https://npm.taobao.org/

  6. eclipse修改中文注释的字体(亲测有用!)

    Window –> Preferences –> General –> Appearance –> Colors and Fonts –> Basic –> Tex ...

  7. 计算机组成原理作业一 熟悉MIPS指令

    第一题 .data outputd: .asciiz "Alpha","November","First","alpha" ...

  8. Liferay JSP Tag Libraries介绍

    Liferay自带了很多标签库,这极大地提高了开发Liferay项目的效率. 下面让我们一起来探索吧. 什么是标签库? 什么是JSP标签? 什么是JSTL? 标签库由下面这几部分组成: Tag Lib ...

  9. jQuery迷你帮助查找功能

    在线演示 本地下载

  10. LA4094 WonderTeam

      杯哥题解.   //Serene #include<algorithm> #include<iostream> #include<cstring> #inclu ...