深度学习:调整学习率

devtools/2024/9/30 0:06:54/

目录

前言

一、什么是调整学习率?

二、调整学习率的作用

三、怎么调整学习

1.有序调整

2.自适应调整

3.自定义调整

4.调整示例


前言

        在学习>深度学习中,调整学习率是非常重要的,它对模型的训练效果和收敛速度有显著影响。

 

一、什么是调整学习率?

  1. 学习率是学习>深度学习中一个关键的超参数,控制着模型在每次更新时权重的调整幅度。它决定了梯度下降算法在最小化损失函数时的步长。较大的学习率可能导致模型不收敛或震荡,而较小的学习率则可能使收敛速度过慢。因此,选择合适的学习率对于模型训练的成功至关重要。
  2. 常用的学习率有0.1、0.01以及0.001等,学习率越大则权重更新越快。一般来说,我们希望在训练初期学习率大一些,使得网络收敛迅速,在训练后期学习率小一些,使得网络更好的收敛到最优解。

 

二、调整学习率的作用

        调整学习率的目的是优化模型训练过程,提高收敛速度,并确保最终模型的性能。通过合理调整学习率,可以避免训练过程中的震荡或不收敛,帮助模型更有效地找到最优解,最终提升模型的泛化能力和准确性。

 

三、怎么调整学习

  • Pytorch学习率调整策略通过 torch.optim.lr_sheduler 接口实现。

1.有序调整

  1. 等间隔调整(Step),
  2. 多间隔调整(MultiStep),
  3. 指数衰减(Exponential),
  4. 余弦退火(CosineAnnealing)

下图是不同方法的概念图:

代码展示:

"""有序调整学习率"""
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)"""等间隔调整"""
torch.optim.lr_scheduler.StepLR(optimizer, step_size=, gamma=0.1)
# optimizer: 神经网络训练中使用的优化器,
# step_size: 学习率下降间隔数,单位是epoch,而不是iteration.
# gamma:学习率调整倍数,默认为0.1
# 每训练step_size个epoch,学习率调整为lr=lr*gamma."""多间隔调整"""
torch.optim.lr_shceduler.MultiStepLR(optimizer, milestones=, gamma=0.1)
# milestone(list): 一个列表参数,表示多个学习率需要调整的epoch值,
# 如milestones=[10, 30, 80],即10轮时将gamma乘以学习率lr,30轮时、80轮时与10轮时操作一致"""指数衰减"""
torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=)
# gamma:学习率调整倍数的底数,指数为epoch,初始值为lr, 倍数为γepoch,每一轮都调整"""余弦退火"""
torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=, eta_min=0)
# T_max:学习率下降到最小值时的epoch数,即当epoch=T_max时,学习率下降到余弦函数最小值,当epoch>T_max时,学习率将增大
# eta_min: 学习率调整的最小值,即epoch=T_max时,lr_min=eta_min, 默认为0.

 

2.自适应调整

  • 依训练状况伺机而变,通过监测某个指标的变化情况(loss、accuracy),当该指标不怎么变化时,就是调整学习率的时机(ReduceLROnPlateau)
"""根据指标调整学习率"""
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)
  • 参数解释:
  • optimizer: 需要调整学习率的优化器。
  • mode: 字符串,选择监控的指标类型。'min' 表示当被监控的指标停止下降时,学习率将减小; 'max' 表示当指标停止上升时减小学习率。
  • factor: 每次调整学习率时,学习率将乘以这个因子(通常在 0 到 1 之间)。例如,float = 0.1表示学习率减少到原来的 10%。
  • patience: 监控指标在没有改善时等待的 epochs 数。在这段时间内,如果指标没有改善,学习率将被调整。
  • verbose: 布尔值,是否在调整学习率时打印消息。
  • threshold: 改变学习率的最小阈值。如果变化小于该阈值,则认为没有改善。这个值可以是绝对值或相对值,具体取决于 threshold_mode
  • threshold_mode: 字符串, 'rel' 表示使用相对阈值(与当前值的比例), 'abs' 表示使用绝对阈值。
  • cooldown: 在学习率被减少后,允许继续训练的 epochs 数。在此期间,将不会调整学习率。
  • min_lr: 学习率的最小值,防止学习率降到过低。
  • eps: 一个很小的值,避免除以零的错误,通常在计算时用作保护。

 

3.自定义调整

  • 通过自定义关于epoch的lambda函数调整学习率(LambdaLR)。
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
# 参数:
# lr_lambda(function or list): 自定义计算学习率调整倍数的函数,通常是epoch的函数,当有多个参数组时,设为list.

 

4.调整示例

  • 在每个epoch的训练中使用 scheduler.step() 即可进行学习率的更新
"""有序调整学习率"""
loss_fn = nn.CrossEntropyLoss()  # 处理多分类
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.5)  # 调整学习率epochs = 50for t in range(epochs):print(f"Epoch {t + 1}\n--------------")train(train_dataloader, model, loss_fn, optimizer)test(test_dataloader, model, loss_fn)scheduler.step()  # 在每个epoch的训练中.使用scheduler.step()语句进行学习率更新
print(best_acc)

http://www.ppmy.cn/devtools/118958.html

相关文章

如何在 Flutter 中实现可拖动的底部弹出框

在 Flutter 开发中,底部弹出框(Bottom Sheet)是一种常见的 UI 组件,通常用于显示一些额外的操作选项或详细信息。在这篇文章中,我将介绍一个自定义的 DragBottomSheetWidget 组件,它不仅支持手势拖动关闭&a…

@overload实际并无作用

overload 装饰器在 Python 中确实有些特殊。 虽然它看起来像是实现了函数重载,但实际上并没有真正改变函数的行为。 overload 主要用于类型提示和提高代码的可读性。 在 Python 中,函数重载(即根据参数类型或数量调用不同的函数实现&#xf…

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库

【鸿蒙HarmonyOS NEXT】数据存储之分布式键值数据库 一、环境说明二、分布式键值数据库介绍三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、分布式键值数据库介绍 KVStore简介: 分布式键值数据库…

图为科技大模型一体机,智领未来社区服务

当AI与边缘计算相遇,一幅关于智慧生活的宏伟蓝图正缓缓展开。 今天,让我们一同探索,如何通过图为大模型一体机,为物业服务插上智能的翅膀。 通过整合采集物业数据,大模型一体机可全方位为物业行业赋能,实…

docker - maven 插件自动构建镜像(构建镜像:ebuy-docker:v2.0)

文章目录 1、docker服务端开启远程访问2、在pom.xml文件plugins下添加Maven的docker插件3、编写dockerfile文件4、执行maven的打包命令5、查看 镜像 ebuy-docker:v2.06、创建 容器 ebuy-dockerv2.0 上面手动构建镜像的过程比较繁琐,使用Maven的docker插件可以实现镜…

Java 之 ssm框架入门

SSM框架作为Java Web开发的热门选择,其强大功能和易用性吸引了众多开发者。以下是我对该框架的理解以及学习建议,仅供参考 一、 SSM框架深度解析 1. Spring 核心技术 IoC (控制反转) 概念: 将对象的创建和管理权利交给Spring容器,通过依赖注…

OpenCV图像文件读写(2) 检查 OpenCV 是否支持某种图像格式的写入功能函数haveImageWriter()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 haveImageWriter 函数用于检查 OpenCV 是否支持某种图像格式的写入功能。这个函数可以帮助开发者在编写代码时确定是否可以成功地将图像写入特定…