深度学习之pytorch常见的学习率绘制

文章目录

    • 0. Scope
    • 1. StepLR
    • 2. MultiStepLR
    • 3. ExponentialLR
    • 4. CosineAnnealingLR
    • 5. ReduceLROnPlateau
    • 6. CyclicLR
    • 7. OneCycleLR
    • 小结
    • 参考文献

https://blog.csdn.net/coldasice342/article/details/143435848

0. Scope

在深度学习中,学习率(Learning Rate, LR)是一个非常重要的超参数,它决定了模型权重更新的步长。选择合适的学习率对于训练过程至关重要,因为它不仅影响模型收敛的速度,还会影响最终模型的性能。然而,固定的学习率可能无法在整个训练过程中都保持最优,因此,学习率衰减(Learning Rate Decay, 或称 Learning Rate Schedule)策略应运而生,通过调整学习率来优化训练过程。

在PyTorch中,可以通过torch.optim.lr_scheduler模块提供的多个学习率调度器(Learning Rate Scheduler)来实现学习率的动态调整。这些调度器可以帮助优化训练过程,提高模型的性能。以下是PyTorch中一些常用的学习率调度器及其简要说明。

1. StepLR

每隔一定数量的epoch后,将学习率乘以一个固定的衰减因子。

scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

参数:
step_size:经过多少个epoch后进行一次学习率衰减。
gamma:学习率的衰减因子,默认为0.1。
示例:

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as np# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = models.resnet18(pretrained=False)max_epoch = 50  # 一共50 epoch
iters = 20      # 每个epoch 有 20 个 bach
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.9)lr = []
for epoch in range(max_epoch):for batch in range(iters):optimizer.zero_grad()optimizer.step()scheduler.step()  # 更新learning rate# current_lr = scheduler.get_last_lr()[0]  #  注意:获取当前学习率不能使用get_lr()current_lr = optimizer.param_groups[0]['lr']lr.append(current_lr)print(f"End of Epoch {epoch + 1}: Current Learning Rate: {current_lr:.6f}")plt.figure(figsize=(10, 8))
plt.plot(range(1, max_epoch + 1), lr, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

在这里插入图片描述

2. MultiStepLR

类似于 StepLR,但允许在不同 epoch 设置不同的学习率衰减点,提供更精细的控制。在指定的epoch列表处,将学习率乘以一个固定的衰减因子。

scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[10, 30], gamma=0.1)

参数:
milestones:一个列表,表示在哪些epoch处进行学习率衰减。
gamma:学习率的衰减因子,默认为0.1。
示例:
在这里插入图片描述

3. ExponentialLR

每个 epoch 将学习率按固定的指数衰减因子 gamma 进行调整。相比于 StepLR,它的衰减更平滑,适合需要持续减小学习率的任务。

scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.95)

参数:
gamma:每个epoch结束时学习率的乘法因子。
示例:
在这里插入图片描述

4. CosineAnnealingLR

CosineAnnealingLR 利用余弦函数的特点,使学习率在训练过程中按照一个周期性变化的余弦曲线来衰减,即学习率从大到小再到大反复变化。通常用于长时间训练任务,能在训练后期有效避免学习率过快下降。
在这里插入图片描述

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

参数:
T_max:一个周期的最大epoch数。
eta_min:学习率的最小值,默认为0。

示例:

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as npnet = models.resnet18(pretrained=False)
max_epoch = 50  # 一共50 epoch
iters = 200     # 每个epoch 有 200 个 bach
update_mode = 'epoch'
if update_mode == 'epoch':optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer=optimizer, T_max=max_epoch)  # * iterslr = []for epoch in range(max_epoch):for batch in range(iters):optimizer.step()lr.append(scheduler.get_lr()[0])scheduler.step()  # 注意 每个epoch 结束, 更新learning rate
else:optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)# 调整了四分之一周期的长度 max_epoch * itersscheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer=optimizer, T_max=max_epoch * iters)  lr = []for epoch in range(max_epoch):for batch in range(iters):optimizer.step()lr.append(scheduler.get_lr()[0])scheduler.step()  # 注意 每个batch 结束, 更新learning rateplt.figure(figsize=(10, 8))
plt.plot(np.arange(len(lr)), lr)
plt.xlabel('Iterations')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

每个epoch更新一次
在这里插入图片描述
每个iteration更新一次
在这里插入图片描述

5. ReduceLROnPlateau

ReduceLROnPlateau 是基于验证集表现来调整学习率的一种方法。当模型的验证集指标(如损失)在一段时间内没有改善时,学习率会自动减小。

scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=10)

和其他学习率更新不一样,ReduceLROnPlateau学习率更新时需要传入对应的参,例如:scheduler.step(ac) ,ac可以是loss或验证集的准确率之类的
参数:
mode:‘min’表示当监测指标不再下降时减少学习率,‘max’表示当监测指标不再上升时减少学习率。
factor:学习率的衰减因子,默认为0.1。
patience:在没有观察到性能提升的epoch数之后减少学习率。
示例:

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as np# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = models.resnet18(pretrained=False)max_epoch = 50  # 一共50 epoch
iters = 20      # 每个epoch 有 20 个 bach
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=2)lr = []
for epoch in range(max_epoch):for batch in range(iters):optimizer.zero_grad()optimizer.step()ac = 1if epoch > 20:ac = 10else:ac = ac - 0.1*epochscheduler.step(ac)  # 更新learning rate# current_lr = scheduler.get_last_lr()[0]  #  注意:获取当前学习率不能使用get_lr()current_lr = optimizer.param_groups[0]['lr']lr.append(current_lr)print(f"End of Epoch {epoch + 1}: Current Learning Rate: {current_lr:.6f}")plt.figure(figsize=(10, 8))
plt.plot(range(1, max_epoch + 1), lr, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

在这里插入图片描述

6. CyclicLR

学习率在一个范围内循环变化。

scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1, step_size_up=20, step_size_down=None,mode="triangular")

参数:
base_lr:学习率的下限。
max_lr:学习率的上限。
step_size_up:从base_lr到max_lr的步数。
step_size_down:从max_lr到base_lr的步数,如果为None,则默认与step_size_up相同。
示例:

CyclicLR - triangular

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as np# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = models.resnet18(pretrained=False)max_epoch = 50  # 一共50 epoch
iters = 20      # 每个epoch 有 20 个 bach
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1, step_size_up=2, step_size_down=None)lr = []
for epoch in range(max_epoch):for batch in range(iters):optimizer.zero_grad()optimizer.step()scheduler.step()  # 更新learning rate# current_lr = scheduler.get_last_lr()[0]  #  注意:获取当前学习率不能使用get_lr()current_lr = optimizer.param_groups[0]['lr']lr.append(current_lr)print(f"End of Epoch {epoch + 1}: Current Learning Rate: {current_lr:.6f}")plt.figure(figsize=(10, 8))
plt.plot(range(1, max_epoch + 1), lr, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

在这里插入图片描述
CyclicLR - triangular2

scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01, max_lr=0.1, step_size_up=2, step_size_down=None,mode="triangular2")

在这里插入图片描述
CyclicLR - exp_range

scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01,max_lr=0.1, step_size_up=5,mode="exp_range", gamma=0.85)

在这里插入图片描述
当step_size_up设置较大时:

scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr=0.01,max_lr=0.1, step_size_up=20,mode="exp_range", gamma=0.85)

在这里插入图片描述

7. OneCycleLR

根据 “1cycle” 策略,先逐步增加学习率,然后在训练的后期快速减小学习率,这种方式能在训练初期提供更快的收敛速度,同时在后期细化模型。

scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, total_steps=None, epochs=100, steps_per_epoch=1)

参数:
max_lr:周期内的最高学习率。
total_steps:整个训练过程中的总步数。注意,如果这里是None,那么必须通过提供epochs和step_per_epoch的值来推断它。
epochs:训练的总轮数。
steps_per_epoch:每个epoch中的步数。
示例:
若每个epoch更新学习率:

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as np# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = models.resnet18(pretrained=False)max_epoch = 50  # 一共50 epoch
iters = 20      # 每个epoch 有 20 个 bach
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, total_steps=None, epochs=max_epoch, steps_per_epoch=1)lr = []
for epoch in range(max_epoch):for batch in range(iters):optimizer.zero_grad()optimizer.step()scheduler.step()  # 更新learning rate# current_lr = scheduler.get_last_lr()[0]  #  注意:获取当前学习率不能使用get_lr()current_lr = optimizer.param_groups[0]['lr']lr.append(current_lr)print(f"End of Epoch {epoch + 1}: Current Learning Rate: {current_lr:.6f}")plt.figure(figsize=(10, 8))
plt.plot(range(1, max_epoch + 1), lr, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

在这里插入图片描述
若每个batch更新学习率:

import torch
from torchvision import models
import matplotlib.pyplot as plt
import numpy as np# device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = models.resnet18(pretrained=False)max_epoch = 50  # 一共50 epoch
iters = 20      # 每个epoch 有 20 个 bach
optimizer = torch.optim.SGD(net.parameters(), lr=0.01, momentum=0.9)
scheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr=0.1, total_steps=None, epochs=max_epoch, steps_per_epoch=iters)lr = []
for epoch in range(max_epoch):for batch in range(iters):optimizer.zero_grad()optimizer.step()scheduler.step()current_lr = optimizer.param_groups[0]['lr']lr.append(current_lr)# scheduler.step()  # 更新learning rate# current_lr = scheduler.get_last_lr()[0]  #  注意:获取当前学习率不能使用get_lr()# current_lr = optimizer.param_groups[0]['lr']# lr.append(current_lr)print(f"End of Epoch {epoch + 1}: Current Learning Rate: {current_lr:.6f}")plt.figure(figsize=(10, 8))
plt.plot(range(1, max_epoch*iters + 1), lr, marker='o')
plt.xlabel('Epochs')
plt.ylabel('Learning Rate')
plt.title('Learning Rate Schedule')
plt.grid(True)
plt.show()

在这里插入图片描述

小结

本文绘制了pytorch中7种常见的学习率,其中没有最好的,只有适合的。无论使用何种学习率策略,主要还是得适合自己的模型训练,切勿邯郸学步。谨以此记,以备后续训练模型时选择合适的学习率。

参考文献

[1] 图解Pytorch学习率衰减策略(一)
[2] 深度学习】图解 9 种PyTorch中常用的学习率调整策略
[3] pytorch余弦退火学习率CosineAnnealingLR的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【扩散——BFS】

题目 代码 #include <bits/stdc.h> using namespace std; const int t 2020, off 2020; #define x first #define y second typedef pair<int, int> PII; int dx[] {0, 0, 1, -1}, dy[] {-1, 1, 0, 0}; int dist[6080][6080]; // 0映射到2020&#xff0c;2020…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

R门 - rust第一课陈天 -内存知识学习笔记

内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…

数据结构--数组

一.线性和非线性 线性&#xff1a;除首尾外只有一个唯一的前驱和后继。eg&#xff1a;数组&#xff0c;链表等。 非线性&#xff1a;不是线性的就是非线性。 二.数组是什么&#xff1f; 数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一…

Vue的基础使用

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 构建用户界面 的 渐进式 框架…

unity单例模式的不同声明(待完善

总结&#xff1a; 这段代码实现了一个泛型单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;用于确保某个类&#xff08;由泛型参数 T 指定&#xff09;在整个应用程序中只有一个实例&#xff0c;并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

SpringBoot后端解决跨域问题

1.全局方式 新建一个conifg配置类&#xff0c;内容如下&#xff1a; Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")//是否发送Cookie.allowCrede…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

stream学习

Stream流 定义 Steam流&#xff0c;用于操作集合或者数组中的数据&#xff0c;大量结合了Lamda表达式的语法风格&#xff0c;代码简洁。 重点&#xff1a; 流只能收集一次 ​ 获取Stream流 Stream流要与数据源建立连接。 1.list ​ 直接调用steam()即可 // list List<Stri…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 1.1 数据库应用系统生命周期 软件工程:软件工程的思想&#xff0c;即用工程的概念、原理、技术和方法对软件生产、开发的全过程进行跟踪和管理 软件开发方法:瀑布模型、快速原型模型、螺旋模型 DBAS生命周期模型 1.2 规划与分析 系统规划与定…

YOLOv11实战垃圾分类

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对4种垃圾数据集进行训练和优化&#xff0c;该数据集包含丰富的垃圾图像样本&am…

【初阶二】认识C语言—上

【初阶二】认识C语言—上 1.数据类型2.变量3.常量4.字符串5.转义字符6.注释7.选择语句 认识C语言讲的是C语言的基础知识&#xff0c;目的是让大家认识这些知识&#xff0c;后续文章会把这些知识深入讲解&#xff0c;知识点很多&#xff0c;篇幅原因分为上下两篇 1.数据类型 每…

线性DP 区间DP C++

线性DP 题一 数字三角形 解题思路 三角形内的某个点&#xff0c;可以从这个点的左上方或右上方来到这个点&#xff0c;因此有状态转移方程&#xff1a; f[i, j] max(f[i - 1, j - 1] a[i][j], f[i - 1][j] a[i][j]) 代码实现 #include<iostream> #include<algor…

D68【python 接口自动化学习】- python基础之数据库

day68 Python执行SQL语句 学习日期&#xff1a;20241114 学习目标&#xff1a;MySQL数据库-- 137 Python执行SQL语句插入到数据库 学习笔记&#xff1a; commit提交 自动commit 总结 commit提交&#xff1a;pymysql库在执行对数据库有修改操作的行为时&#xff0c;是需要通…

【项目组件】第三方库——websocketpp

目录 第三方协议&#xff1a;websocket websocket简介 websocket特点 websocket协议切换 websocket协议格式段 websocketpp库介绍 endpoint server connection websocketpp库搭建服务器流程 基本框架实现 业务处理回调函数的实现 http_callback open_callback …

超越传统:探索ONLYOFFICE的革命性办公新纪元

目录 &#x1f341;引言 &#x1f341;一、ONLYOFFICE产品简介 &#xff08;一&#xff09;、介绍 &#xff08;二&#xff09;、基本功能简介 &#x1f341;二、核心功能具体介绍 1、编辑操作 2、文本与段落&#xff1a; 3、样式与图形&#xff1a; 4、表格与图表&…

python解析网页上的json数据落地到EXCEL

安装必要的库 import requests import pandas as pd import os import sys import io import urllib3 import json测试数据 网页上的数据结构如下 {"success": true,"code": "CIFM_0000","encode": null,"message": &quo…

115页PDF | 埃森哲_XX集团信息化能力成熟度评估及能力提升方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息化能力成熟度评估及能力提升方案&#xff0c;报告首先分析了集团的战略规划&#xff0c;包括调整优化期、转型升级期和跨越发展期的目标&#xff0c;然后识别了集团面临的内部挑战和外部压力&#xff0c;如管控体系不完善、业务板块多样化…

PostgreSQL中表的数据量很大且索引过大时怎么办

在PostgreSQL中&#xff0c;当表的数据量很大且索引过大时&#xff0c;可能会导致性能问题。以下是一些优化索引和表数据的方法&#xff1a; 1. 评估和删除不必要的索引 识别未使用的索引&#xff1a;使用pg_stat_user_indexes和pg_index系统视图来查找未被使用的索引&#x…

智谱AI清影升级:引领AI视频进入音效新时代

前几天智谱推出了新清影,该版本支持4k、60帧超高清画质、任意尺寸&#xff0c;并且自带音效的10秒视频,让ai生视频告别了"哑巴时代"。 智谱AI视频腾空出世&#xff0c;可灵遭遇强劲挑战&#xff01;究竟谁是行业翘楚&#xff1f;(附测评案例)之前智谱出世那时体验了一…