百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

轻松学Pytorch-常见训练时学习率调整策略

yuyutoo 2024-10-21 12:07 4 浏览 0 评论

#技术派的书架#

Pytorch中常见学习率调整函数

学习率作为超参数,训练过程中其实是可以动态调整的,这个很多深度学习框架都予以支持,Pytorch框架在这个方面接口化做的非常符合开发者愿意。Pytorch的可调节学习率的方式主要是借助于Pytorch优化器包中几个学习率动态调节函数,相关的学习率调整。torch.optim.lr_scheduler 提供了几种基于epoch的动态学习率调整函数。它们的解释与使用方法分别如下:

01函数一

该函数表示在发现loss不再降低或者acc不再提高之后,降低学习率。

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

02函数二

设置学习率为上一次的学习率乘以给定lr_lambda函数的值

torch.optim.lr_scheduler.MultiplicativeLR(
optimizer, // 优化器
lr_lambda, // 函数
last_epoch=-1, // 学习率最后一个epoch,计数
verbose=False
)

03函数三

周期性的学习率调整函数,指定多个epoch调整一次学习率,学习率每次调整由gamma参数决定,step_size表示epoch的周期大小

torch.optim.lr_scheduler.StepLR(
optimizer,
step_size,
gamma=0.1,
last_epoch=-1,
verbose=False
)

代码演示如下:

# 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()

主要:必须最后完成学习率更新!

04函数四

该函数跟StepLR的区别是为StepLR是周期性改变学习率,而该函数可以用户自定义epoch的里程碑,根据自定义的里程碑来调整学习率。

torch.optim.lr_scheduler.MultiStepLR(
optimizer, // 优化器
milestones, // 表示定义epoch里程碑
gamma=0.1,
last_epoch=-1,
verbose=False
)

代码演示如下:

# Assuming optimizer uses lr = 0.05 for all groups
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 80
# lr = 0.0005   if epoch >= 80
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
for epoch in range(100):
         train(...)
         validate(...)
         scheduler.step()

05函数五:

使用指数衰减模型来调整学习率

torch.optim.lr_scheduler.ExponentialLR(
optimizer,
gamma,
last_epoch=-1,
verbose=False
)

06函数六:

基于余弦退火函数实现学习率调整的

torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max,
eta_min=0,
last_epoch=-1,
verbose=False
)

每个epoch的学习率表达式如下:

07函数七

上述的函数都是每个epoch之后调整学习率,该函数支持每个step/batch调整学习率。函数与参数表示如下:

torch.optim.lr_scheduler.CyclicLR(
    optimizer,
    base_lr,
    max_lr,
    step_size_up=2000,
    step_size_down=None,
    mode='triangular',
    gamma=1.0,
    scale_fn=None,
    scale_mode='cycle',
    cycle_momentum=True,
    base_momentum=0.8,
    max_momentum=0.9,
    last_epoch=-1,
    verbose=False
)

代码演示如下:

optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1)
data_loader = torch.utils.data.DataLoader(...)
for epoch in range(10):
    for batch in data_loader:
        train_batch(...)
        scheduler.step()

相关推荐

MATLAB实例讲解—求二元函数的极值

实例程序...

解析式大赛的获奖作品代码和公式公布啦!

上方超级数学建模可加关注传播数学干货,学会理性的方式去思考问题大家期待已久的运行代码终于新鲜出炉了!!!抱歉让各位粉丝久等了接下来就是揭秘奇迹的时刻1、emoji解析式:无代码:holdon...

基于MATLAB的ACC控制算法设计及仿真测试

作者...

MATLAB基础学习之坐标转换(matlab改坐标)

(一)平面坐标转换1.cart2pol:将笛卡尔坐标转换为极坐标;2.pol2cart:将极坐标转换为笛卡尔坐标;(二)立体坐标转换1.cart2sph:将笛卡尔坐标转换为极坐标;2.sph2cart...

Java NIO:从 Buffer、Channel、Selector 到 Zero-copy、I/O 多路复用

NIO...

「太极创客」零基础入门学用物联网 - MQTT篇 1-9 自我测试

到目前为止,我们已经掌握了MQTT通讯的基本流程以及如何使用ESP8266来发布和订阅MQTT消息。这节课我们来进行自我测试。...

用豆包改了一下午程序,感觉它聪明得超乎想象

之前低估了AI的聪明程度,AI持续学习下去,未来可以做的事情太多了,编程已经算是比较复杂的事情都能完成得这么好,那些项目计划、工作报告更是小儿科。今天用豆包改了几个程序,提出的BUG也能修改完成...

Node-Media-Server开源流行Nodejs流媒体服务器

简介Node-Media-Server一个Node.js实现的RTMP/HTTP/WebSocket/HLS/DASH流媒体服务器。开源github地址:https://github.com/il...

如何应对 RAG 开发挑战?12 个痛点逐一击破

受到论文《SevenFailurePointsWhenEngineeringaRetrievalAugmentedGenerationSystem》的启发,并结合实际开发RAG(检...

团队协作-代码格式化工具clang-format

环境:clang-format:10.0.0前言统一的代码规范对于整个团队来说十分重要,通过git/svn在提交前进行统一的ClangFormat格式化,可以有效避免由于人工操作带来的代码格式问题。C...

如何编写自己的Arduino库?(arduino怎么自己写库)

支持一对一答疑的购买地址...

Auto CAD 命令(A)(cad命令aaw)

ABOUT(命令)显示有关产品的信息。...

一文读懂设计模式,看这篇就够了(设计模式是干嘛的)

转载:javadoop.com/post/design-pattern一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的,花...

ASL开发者指南:构建健壮高效的C++应用

1.库介绍AdobeSourceLibraries(ASL),现在由stlab维护,是一组专注于提供高质量、经过实战检验的C++组件的集合。它最初由Adobe公司开发,旨在解决构建...

linux下GDB使用方法(linux怎么用gdb调试)

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程...

取消回复欢迎 发表评论: