pytorch08:学习率调整策略

在这里插入图片描述

目录

  • 一、为什么要调整学习率?
    • 1.1 class _LRScheduler
  • 二、pytorch的六种学习率调整策略
    • 2.1 StepLR
    • 2.2 MultiStepLR
    • 2.3 ExponentialLR
    • 2.4 CosineAnnealingLR
    • 2.5 ReduceLRonPlateau
    • 2.6 LambdaLR
  • 三、学习率调整小结
  • 四、学习率初始化

一、为什么要调整学习率?

学习率(learning rate):控制更新的步伐
一般在模型训练过程中,在开始训练的时候我们会设置学习率大一些,随着模型训练epoch的增加,学习率会逐渐设置小一些。

1.1 class _LRScheduler

学习率调整的父类函数
在这里插入图片描述
主要属性:
• optimizer:关联的优化器
• last_epoch:记录epoch数
• base_lrs:记录初始学习率
主要方法:
• step():更新下一个epoch的学习率,该操作必须放到epoch循环下面
• get_lr():虚函数,计算下一个epoch的学习率

二、pytorch的六种学习率调整策略

2.1 StepLR

在这里插入图片描述

功能:等间隔调整学习率
主要参数:
• step_size:调整间隔数
• gamma:调整系数
调整方式:lr = lr * gamma

代码实现:

import torch
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plttorch.manual_seed(1)LR = 0.1
iteration = 10
max_epoch = 200
# ------------------------------ fake data and optimizer  ------------------------------weights = torch.randn((1), requires_grad=True)
target = torch.zeros((1))optimizer = optim.SGD([weights], lr=LR, momentum=0.9)# ------------------------------ 1 Step LR ------------------------------
# flag = 0
flag = 1
if flag:scheduler_lr = optim.lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)  # 设置学习率下降策略,50轮下降一次,每次下降10倍lr_list, epoch_list = list(), list()for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()  # 学习率更新策略plt.plot(epoch_list, lr_list, label="Step LR Scheduler")plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()

输出结果:
在这里插入图片描述

因为我们设置每50个epoch降低一次学习率,所以在7774554

2.2 MultiStepLR

在这里插入图片描述

功能:按给定间隔调整学习率
主要参数:
• milestones:设定调整时刻数
• gamma:调整系数
调整方式:lr = lr * gamma

代码实现

flag = 1
if flag:milestones = [50, 125, 160]  # 设置学习率下降的位置scheduler_lr = optim.lr_scheduler.MultiStepLR(optimizer, milestones=milestones, gamma=0.1)lr_list, epoch_list = list(), list()for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="Multi Step LR Scheduler\nmilestones:{}".format(milestones))plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()

输出结果
在这里插入图片描述

根据我们设置milestones = [50, 125, 160],发现学习率在这三个地方发生下降。

2.3 ExponentialLR

在这里插入图片描述

功能:按指数衰减调整学习率
主要参数:
• gamma:指数的底
调整方式:lr = lr * gamma^epoch;这里的gamma通常设置为接近1的数值,例如:0.95

代码实现

flag = 1
if flag:gamma = 0.95scheduler_lr = optim.lr_scheduler.ExponentialLR(optimizer, gamma=gamma)lr_list, epoch_list = list(), list()for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="Exponential LR Scheduler\ngamma:{}".format(gamma))plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()

输出结果
在这里插入图片描述

可以发现学习率是呈指数下降的。

2.4 CosineAnnealingLR

在这里插入图片描述

功能:余弦周期调整学习率
主要参数:
• T_max:下降周期
• eta_min:学习率下限
调整方式:
在这里插入图片描述

代码实现

flag = 1
if flag:t_max = 50scheduler_lr = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=t_max, eta_min=0.)lr_list, epoch_list = list(), list()for epoch in range(max_epoch):lr_list.append(scheduler_lr.get_lr())epoch_list.append(epoch)for i in range(iteration):loss = torch.pow((weights - target), 2)loss.backward()optimizer.step()optimizer.zero_grad()scheduler_lr.step()plt.plot(epoch_list, lr_list, label="CosineAnnealingLR Scheduler\nT_max:{}".format(t_max))plt.xlabel("Epoch")plt.ylabel("Learning rate")plt.legend()plt.show()

输出结果
在这里插入图片描述

2.5 ReduceLRonPlateau

在这里插入图片描述

功能:监控指标,当指标不再变化则调整,例如:可以监控我们的loss或者准确率,当其不发生变化的时候,调整学习率。
主要参数:
• mode:min/max 两种模式
min模式:当某一个值不下降的时候我们调整学习率,通常用于监控损失
max模型:当某一个值不上升的时候我们调整学习率,通常用于监控精确度
• factor:调整系数
• patience:“耐心”,接受几次不变化
• cooldown:“冷却时间”,停止监控一段时间
• verbose:是否打印日志
• min_lr:学习率下限
• eps:学习率衰减最小值

代码实现

flag = 1
if flag:loss_value = 0.5accuray = 0.9factor = 0.1  # 学习率变换参数mode = "min"patience = 10  # 能接受多少轮不变化cooldown = 10  # 停止监控多少轮min_lr = 1e-4  # 设置学习率下限verbose = True  # 打印更新日志scheduler_lr = optim.lr_scheduler.ReduceLROnPlateau(optimizer, factor=factor, mode=mode, patience=patience,cooldown=cooldown, min_lr=min_lr, verbose=verbose)for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()#if epoch == 5:# loss_value = 0.4scheduler_lr.step(loss_value) #监控的标量是否下降

输出结果
在这里插入图片描述

2.6 LambdaLR

在这里插入图片描述
功能:自定义调整策略
主要参数:
• lr_lambda:function or list

代码实现

flag = 1
if flag:lr_init = 0.1weights_1 = torch.randn((6, 3, 5, 5))weights_2 = torch.ones((5, 5))optimizer = optim.SGD([{'params': [weights_1]},{'params': [weights_2]}], lr=lr_init)# 设置两种不同的学习率调整方法lambda1 = lambda epoch: 0.1 ** (epoch // 20)  # 每到20轮的时候学习率变为原来的0.1倍lambda2 = lambda epoch: 0.95 ** epoch  # 将学习率进行指数下降scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])lr_list, epoch_list = list(), list()for epoch in range(max_epoch):for i in range(iteration):# train(...)optimizer.step()optimizer.zero_grad()scheduler.step()lr_list.append(scheduler.get_lr())epoch_list.append(epoch)print('epoch:{:5d}, lr:{}'.format(epoch, scheduler.get_lr()))plt.plot(epoch_list, [i[0] for i in lr_list], label="lambda 1")plt.plot(epoch_list, [i[1] for i in lr_list], label="lambda 2")plt.xlabel("Epoch")plt.ylabel("Learning Rate")plt.title("LambdaLR")plt.legend()plt.show()

输出结果
在这里插入图片描述

通过lambda方法定义了两种不同的学习率下降策略。

三、学习率调整小结

  1. 有序调整:Step、MultiStep、Exponential 和 CosineAnnealing
  2. 自适应调整:ReduceLROnPleateau
  3. 自定义调整:Lambda

四、学习率初始化

1、设置较小数:0.01、0.001、0.0001
2、搜索最大学习率: 参考该篇《Cyclical Learning Rates for Training Neural Networks》
方法:我们可以设置学习率逐渐从小变大观察精确度的一个变化,下面这幅图,当学习率为0.055左右的时候模型精确度最高,当学习率大于0.055的时候精确度出现下降情况,所以在模型训练过程中我们可以设置学习率为0.055作为我们的初始学习率。
在这里插入图片描述

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

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

相关文章

苹果电脑菜单栏应用管理软件Bartender 4 mac软件特点

Bartender mac是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 Bartender mac软件特点 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时显示。这样可以…

Windows PowerShell的安全目标——安全警报

Windows PowerShell的安全目标——安全警报 1. 保证Shell安全 ​ 自从2006年年底PowerShell发布以来,微软在安全和脚本方面并没有取得很好的名声。毕竟那个时候,**VBScript和Windows Script Host(WSH)**是两个最流行的病毒和恶意软件的载体&#xff0c…

Linux环境vscode clang-format格式化:vscode clang format command is not available

问题现象 vscode安装了clang-format插件,但是使用就报错 问题原因 设置中配置的clang-format插件工具路径不正确。 解决方案 确认本地安装了clang-format工具:终端输入clang-format(也可能是clang-format-13等版本,建议tab自…

Jenkins工具使用

学习目录: 1、jenkins的安装 2、junkins的常规使用 3、jenkins在接口自动化测试实践 具体内容: 1、jenkins的安装 安装包下载:推荐Index of /jenkins/war/latest/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,…

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

前端开发加速器:十个VSCode插件精选

前端开发是一个不断发展的领域,随着技术的进步,工具也在不断更新。Visual Studio Code(VSCode)是前端开发者广泛使用的编辑器之一,得益于其强大的插件系统,可以帮助开发者提升工作效率。以下是十个对于前端…

ubuntu22.04配置双网卡绑定提升带宽

这里写自定义目录标题 Bonding简介配置验证参考链接 Bonding简介 bonding(绑定)是一种linux系统下的网卡绑定技术,可以把服务器上n个物理网卡在系统内部抽象(绑定)成一个逻辑上的网卡,能够提升网络吞吐量、实现网络冗余、负载均衡等功能,有很…

ArkTS - @Prop、@Link

一、作用 Prop 装饰器 和Link装饰器都是父组件向子组件传递参数,子组件接收父组件参数的时候用的,变量前边需要加上Prop或者Link装饰器即可。(跟前端vue中父组件向子组件传递参数类似) // 子组件 Component struct SonCom {Prop…

thingsboard前端缓存--nginx

thingsboardnginx thingsboard部署到阿里云服务器之后,由于登录界面要发送的文件很大,并且服务器的带宽目前有限,因此配置一个nginx,进行前端页面的一些缓存,参考了https://qianchenzhumeng.github.io/posts/Nginx%E5…

《设计模式》之策略模式

策略模式定义 比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略。 策略模式结构 策略模式需要一个策略…

MySQL所有常见问题

一、事务 定义:一组操作要么全部成功,要么全部失败,目的是为了保证数据最终的一致性 在MySQL中,提供了一系列事务相关的命令: start transaction | begin | begin work:开启一个事务commit:提交一个事务rollback:回滚一个事务事务的ACID 原子性(Atomicity):当前事…

Centos7静态网络配置

在vmware中打开, 点击虚拟网络编辑器,修改以下配置 网关IP最后一位固定为2,这个160根据下图中vmnet8的ip地址来的 打开网络控制面板>打开vmnet8查看 接着打开linux,有桌面版的使用桌面版更加方便 箭头这么乱,但是你…

led台灯哪些牌子性价比高?那些性价比高的LED护眼台灯推荐

台灯作为家居用品在日常生活中使用频繁。用户可以根据个人需求和喜好,在市场上找到合适的款式。然而,由于台灯种类繁多,甚至连相关标准都存在差异,这使得一些缺乏经验的购物小白感到困扰。那么,led台灯哪些牌子性价比高…

WAF的概念、分类和应用

WAF(Web Application Firewall,Web应用防火墙)是一种保护Web应用程序的安全工具,它可以监控、过滤和阻止Web应用程序和互联网之间的HTTP流量。WAF通常可以防御一些常见的Web攻击,如跨站请求伪造(CSRF&#…

性能优化-OpenMP基础教程(三)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序,包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能&#…

[论文分享]TimesURL:通用时间序列表示学习的自监督对比学习

论文题目:TimesURL: Self-supervised Contrastive Learning for Universal Time Series Representation Learning 论文地址:https://arxiv.org/abs/2312.15709 代码地址:暂无 摘要 学习适用于各种下游任务的通用时间序列表示具有挑战性&…

Ansible的安装及简单使用

## Ansible的安装及简单使用 ## 一.Ubuntu安装Ansible sudo apt update sudo apt install ansible #使用以下命令检查安装是否成功: ansible --version二.配置Ansible #进入配置文件目录 cd /etc/ansible/ ls#文件含义 ansible.cfg #ansible配置文件,默认基本不用…

计算机组成原理 CPU的功能和基本结构和指令执行过程

文章目录 CPU的功能和基本结构CPU的功能CPU的基本结构 指令执行过程指令周期概念指令执行方案指令数据流取周期数据流析指周期数据流执行周期数据流中断周期数据流 数据通路的功能和基本结构数据通路的功能数据通路的结构单总线 CPU的功能和基本结构 #mermaid-svg-0uHwjZOZh4kS…

图神经网络入门

图神经网络(GNN)是一组在图领域工作的深度学习方法。 这些网络最近已应用于多个领域,包括: 组合优化、推荐系统、计算机视觉—仅举几例。 这些网络还可用于对大型系统进行建模,例如社交网络、蛋白质-蛋白质相互作用网络…

zabbix通过自动发现-配置监控项、触发器(小白教程)

自动发现配置参考链接(不小白,不友好) zabbix-get介绍 1配置 zabbix server:版本7(不影响),IP地址:192.168.0.60zabbix agent:版本agent1(不影响)&#xff…