深度学习之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) 是一套 构建用户界面 的 渐进式 框架…

【C++进阶实战】扫雷小游戏

扫雷游戏 题目描述&#xff1a; 开发一个简单的扫雷游戏&#xff0c;支持以下功能&#xff1a; 初始化游戏板&#xff0c;随机放置地雷。用户选择一个格子进行挖掘。如果用户挖到地雷&#xff0c;游戏结束。如果用户挖到空格子&#xff0c;显示相邻的空格子。用户可以选择标记…

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…

Java 基础知识

一.泛型编程 1. 泛型的概念和作用是什么&#xff1f; 概念&#xff1a;泛型&#xff08;Generics&#xff09;是在 JDK 5.0 引入的新特性&#xff0c;允许在定义类、接口和方法时使用类型参数。类型参数在使用时被具体的类型替换。作用&#xff1a; 类型安全性&#xff1a;避…

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

一、修改验证方法 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…

Python 编程入门指南(一)

1. Python 简介 Python是一种广泛使用的高级编程语言,因其简洁的语法和强大的功能而备受欢迎。Python由Guido van Rossum于20世纪90年代初设计,旨在提供易于阅读和编写的代码,适合从初学者到专业开发者的各个水平。它是一种解释型语言,这意味着在编写和执行代码之间不需要…

计算机三级 数据库技术

第一章 数据库应用系统开发方法 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.数据类型 每…

CSS响应式布局实现1920屏幕1rem等于100px

代码解析与实现 设置根元素的 font-size 为 5.208333vw 假设你想让根元素的 font-size 基于视口宽度来动态调整。我们可以通过设置 font-size 为 5.208333vw 来让 1rem 相当于视口宽度的 5.208333%。 计算 5.208333vw: 当屏幕宽度为 1920px 时&#xff0c;5.208333vw 等于 5…

线性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;是需要通…

《Python Web 抓取实战:豆瓣电影 Top 250 数据抓取与分析》

引言 在信息爆炸的时代&#xff0c;掌握数据获取的能力显得尤为重要。通过数据抓取&#xff0c;我们可以从互联网上获取大量有价值的信息&#xff0c;并进行深入分析。本文将介绍如何使用 Python 进行 Web 抓取&#xff0c;以豆瓣电影 Top 250 为例&#xff0c;展示数据抓取的…

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

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