当前位置: 首页 > news >正文

学习率的调整

1.  lr_scheduler机制

有的时候需要我们通过一定机制来调整学习率,这个时候可以借助于torch.optim.lr_scheduler类来进行调整;torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(learning rate)的方法。一般情况下我们会设置随着epoch的增大而逐渐减小学习率从而达到更好的训练效果

torch.optim.lr_scheduler.StepLR

class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma=0.1, last_epoch=-1)
  • optimizer (Optimizer):要更改学习率的优化器;
  • step_size(int):每训练step_size个epoch,更新一次参数;
  • gamma(float):更新lr的乘法因子;
  • last_epoch (int):最后一个epoch的index,如果是训练了很多个epoch后中断了,继续训练,这个值就等于加载的模型的epoch。默认为-1表示从头开始训练,即从epoch=1开始。

每过step_size个epoch,做一次更新:
n e w _ l r = i n i t i a l _ l r × γ e p o c h / / s t e p _ s i z e new\_lr = initial\_lr \times \gamma^{epoch // step\_size} new_lr=initial_lr×γepoch//step_size

其中new_lr是得到的新的学习率,lrinitial_lr是初始的学习率,sizestep_size是参数step_size, \gammaγ是参数gamma。

2.

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import StepLR
import itertools
 
 
initial_lr = 0.1
 
class model(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3)
 
    def forward(self, x):
        pass
 
net_1 = model()
 
optimizer_1 = torch.optim.Adam(net_1.parameters(), lr = initial_lr)
scheduler_1 = StepLR(optimizer_1, step_size=3, gamma=0.1)
 
print("初始化的学习率:", optimizer_1.defaults['lr'])
 
for epoch in range(1, 11):
    # train
    optimizer_1.zero_grad()
    optimizer_1.step()
    print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
    scheduler_1.step()

3. 通常scheduler.step() 需要在optimizer.step()后面使用

import torch
import torch.nn as nn
import torch.optim as optim

model = nn.Conv2d(3, 64, 3)
optimizer = optim.SGD(model.parameters(), lr=0.5)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2)

for i in range(5):
    optimizer.zero_grad()
    x = model(torch.randn(3, 3, 64, 64))
    loss = x.sum()
    loss.backward()
    print('{} optim: {}'.format(i, optimizer.param_groups[0]['lr']))
    optimizer.step()
    print('{} scheduler: {}'.format(i, lr_scheduler.get_lr()[0]))
    lr_scheduler.step()

官网中的举例

  1. scheduler.step()是放在train()之后的
  2. 而optimizer.step()应该在train()里面的(每batch-size更新一次梯度)
  3. 说明scheduler.step()正确顺序就应该在optimizer.step()后面
>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 60
>>> # lr = 0.0005 if 60 <= epoch < 90
>>> # ...
>>> scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
>>> for epoch in range(100):
>>> train(...)
>>> validate(...)
>>> scheduler.step()

相关文章:

  • 二叉堆与自定义优先队列实现删除任意元素
  • 因果系列文章(3)——有向无环图
  • 02 数据库语言SQL
  • [简化开发] mybatis plus自动填充 INSERT 与 INSERT_UPDATE 坑(记录)
  • 如何构建一款自定义的开源微服务架构?
  • SNMP工具
  • Python学习:函数中定义参数的四种方式
  • 4个非常实用的Java项目,快用起来
  • 基于Sentry打造前端性能监控平台
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • 强化学习(ICML2022)
  • CS5181E 单节锂电池充电管理IC特点及应用
  • 计算机毕业论文基于springboot的社区物业服务管理项目源码
  • Hbase大批量数据迁移之BulkLoad
  • java计算机毕业设计外贸服装订单管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  • 2017-09-12 前端日报
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • chrome扩展demo1-小时钟
  • Javascript Math对象和Date对象常用方法详解
  • JS数组方法汇总
  • js中的正则表达式入门
  • React16时代,该用什么姿势写 React ?
  • SSH 免密登录
  • WePY 在小程序性能调优上做出的探究
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 程序员最讨厌的9句话,你可有补充?
  • 基于Vue2全家桶的移动端AppDEMO实现
  • ------- 计算机网络基础
  • 源码安装memcached和php memcache扩展
  • MyCAT水平分库
  • $().each和$.each的区别
  • (12)Linux 常见的三种进程状态
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)elasticsearch 源码之启动流程分析
  • (生成器)yield与(迭代器)generator
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET NPOI导出Excel详解
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET面试题(二)
  • .NET企业级应用架构设计系列之应用服务器
  • .so文件(linux系统)
  • ::什么意思
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [.net] 如何在mail的加入正文显示图片
  • [AIGC] 如何建立和优化你的工作流?
  • [C#]winform制作圆形进度条好用的圆环圆形进度条控件和使用方法
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [CTO札记]如何测试用户接受度?
  • [javaSE] GUI(事件监听机制)