pytorch手动调整学习率

news2025/4/26 17:02:17

文章目录

    • 1. 为什么引入学习率衰减?
    • 2. 针对不同层设置不一样的学习率
    • 3. 手动更新学习率
    • 4. 使用学习率调度器
    • 5. 推荐做法

在前面的文章中,介绍了各种学习率。在此,将进行拓展,学习如何手动更新学习率(即不使用pytorch自带的学习率调度器)。本文详细探讨了学习率衰减在神经网络优化中的作用,包括为何引入、如何调整不同层的学习率、手动设置衰减方法以及利用PyTorch内置的lr_scheduler。通过实例演示了如何在实际项目中应用这些策略以提高模型性能。

1. 为什么引入学习率衰减?

我们都知道几乎所有的神经网络采取的是梯度下降法来对模型进行最优化,其中标准的权重更新公式:

W+=α∗ gradient 

学习率 α 控制着梯度更新的步长(step),α越大,意味着下降的越快,到达最优点的速度也越快,如果为0,则网络就会停止更新。学习率过大,在算法优化的前期会加速学习,使得模型更容易接近局部或全局最优解。但是在后期会有较大波动,甚至出现损失函数的值围绕最小值徘徊,波动很大,始终难以达到最优。

总而言之,通过引入学习率衰减,在模型训练初期,会使用较大的学习率进行模型优化,随着迭代次数增加,模型逐渐收敛,学习率会逐渐进行减小,保证模型在训练后期不会有太大的波动,从而更加接近最优解。

2. 针对不同层设置不一样的学习率

当我们在使用预训练的模型时,需要对分类层进行单独修改并进行初始化,其他层的参数采用预训练的模型参数进行初始化,这个时候我们希望在进行训练过程中,除分类层以外的层只进行微调,不需要过多改变参数,因此需要设置较小的学习率。而改正后的分类层则需要以较大的步子去收敛,学习率往往要设置大一点

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.net1 = nn.Linear(2,10)
        self.net2 = nn.Linear(10,1)
    def forward(self, x):
        x = self.net1(x)
        x = self.net2(x)
        return x
net = Net()
optimizer = optim.SGD([
        {"params":model.net1.parameters()},
        {"params":model.net2.parameters(),"lr":1e-5},],
        lr=1e-2, #默认参数
    )
for epoch in range(100):
        print("Epoch:{}  Lr:{:.2E}".format(epoch,optimizer.state_dict()['param_groups'][0]['lr']))
        print("Epoch:{}  Lr:{:.2E}".format(epoch,optimizer.state_dict()['param_groups'][1]['lr']))
        optimizer.step()

3. 手动更新学习率

根据衰减参数设置学习率:

for param_group in self.optimizer.param_groups:
    param_group['lr'] = self.learning_rate * (self.gamma ** (epoch // self.lr_decay))

根据参数列表设置学习率:

def adjust_learning_rate_list(optimizer, epoch):
    lr_set_list = [[1,1e-1],[2,1e-2],[3,1e-3],[4,1e-4],[5,1e-5]]# 执行此学习率的epoch数
    lr_list = []
    for i in lr_set_list:
        for j in range(i[0]):
            lr_list.append(i[1])
    for param_group in optimizer.param_groups:
        if epoch < len(lr_list)-1:
            param_group['lr'] = lr_list[epoch]
        else:
            param_group['lr'] = lr_list[-1]

optimizer = torch.optim.SGD(net.parameters(),lr = start_lr)
for epoch in range(100):
    adjust_learning_rate_list(optimizer,epoch)
    print("Epoch:{}  Lr:{:.2E}".format(epoch,optimizer.state_dict()['param_groups'][0]['lr']))
    for data,label in traindataloader :
        data = data.cuda()
        label = label.cuda()
        output = net(data)
        loss = myloss(output,label)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

优点:
灵活性:你可以完全控制学习率如何随时间变化,包括调整衰减率(self.gamma)、衰减间隔(self.lr_decay)等。
简单性:对于简单的学习率调整策略,代码相对简洁明了。

缺点:
维护成本:需要手动在每个epoch后更新学习率,增加了代码的复杂性,尤其是在训练循环中。
易出错:容易忘记更新学习率或更新错误,特别是在复杂的训练流程中。
不易复用:每次训练都需要手动设置和调整学习率更新逻辑。

4. 使用学习率调度器

PyTorch提供了多种学习率调度器,如StepLR、MultiStepLR、ExponentialLR等。

例如,使用ExponentialLR:

scheduler = torch.optim.lr_scheduler.ExponentialLR(self.optimizer, gamma=self.gamma)
# 在每个epoch后调用
scheduler.step()

优点:
自动化:学习率调度器自动在每个epoch(或指定的steps)后更新学习率,减少了手动干预。
易维护:代码更加整洁,学习率策略的配置和更新逻辑被封装在调度器中。
可复用性:调度器可以很容易地在不同的训练任务中复用。
灵活性:虽然调度器提供了常见的学习率调整策略,但也可以通过继承自定义调度器来实现更复杂的学习率策略。

缺点:
学习曲线:对于初学者来说,可能需要一些时间来熟悉不同调度器的使用方法和适用场景。

关于pytorch各种学习率,可以参考这篇文章:深度学习之pytorch常见的学习率绘制

5. 推荐做法

对于大多数情况,建议使用PyTorch提供的学习率调度器。它们不仅简化了学习率的管理,还提供了多种常见的学习率策略,并且易于扩展和定制。手动更新学习率更适合于非常特定或复杂的学习率调整需求,以及对学习率策略有深入理解和控制需求的场景。

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

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

相关文章

SVN仓库突然没有权限访问

如果svn仓库突然出现无法访问的情况&#xff0c;提示没有权限&#xff0c;所有账号都是如此&#xff0c;新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时&#xff0c;大概率库里面的文件有http或者https的字样&#xff0c;因为单独给该文件添加权限导致…

【Qt】文件

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; Qt 文件概述 二&#xff1a;&#x1f525; 输入输出设备类 三&#xff1a;&#x1f525; 文件读写类 四&#xff1a;&#x1f525; 文件和目录信息类 五&…

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南

一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务&#xff0c;专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据&#xff0c;为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…

dstream

DStream转换DStream 上的操作与 RDD 的类似&#xff0c;分为 Transformations&#xff08;转换&#xff09;和 Output Operations&#xff08;输出&#xff09;两种&#xff0c;此外转换操作中还有一些比较特殊的原语&#xff0c;如&#xff1a;updateStateByKey()、transform(…

HFSS5(李明洋)——设置激励(波端口激励)

Magnetic是适用于铁磁氧导体的&#xff0c;只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部&#xff0c;如果是设置在模型内部必须加一段理想导体&#xff0c;用于指定端口方向 1.1——模式 number 输入N&#xff1a;计算1-N的模式都计算 1.2——模式…

ubiquant比赛系列——用docker准备ubipoker开发环境

比赛过程&#xff1a; 环境准备&#xff1a; #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…

Rust实现高性能目录扫描工具ll的技术解析

Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具&#xff0c;具备以下核心特性&#xff1a; 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clap&#xff…

深入理解C语言变量:从基础到实践

在编程世界中&#xff0c;变量是最基础也是最重要的概念之一。作为C语言的核心组成部分&#xff0c;变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法&#xff0c;是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面&#xff0c…

RK3562/3588 系列之0—NPU基础概念

RK3562/3588 系列之0—NPU基础概念 1.处理器分类2.算力衡量指标TOPS参考文献 1.处理器分类 中央处理器(CPU)&#xff1b; 图形处理器 (GPU)&#xff1b; 神经网络处理器(NPU)。 每个处理器擅长不同的任务:CPU擅长顺序控制和即时性&#xff1b;GPU适合并行数据流处理,NPU擅长…

canvas画板!随意画!!

希望你天天开心 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绘画板</title…

Float32、Float16、BFloat16

我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示&#xff0c;来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 &#xff1a; 单精度浮点数…

5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 一、起源&#xff1a;USB标准与早期电力传输需求 1. USB的诞生背景 1996年&#xff0c;由英特尔、微软、IBM等公司组成的USB-IF&#xff08;USB Implementers Forum&#xff09;发布了…

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…

龙虎榜——20250425

指数依然在震荡&#xff0c;等待方向选择&#xff0c;整体量能不搞但个股红多绿少。 2025年4月25日龙虎榜行业方向分析 一、核心主线方向 绿色电力&#xff08;政策驱动业绩弹性&#xff09; • 代表标的&#xff1a;华银电力&#xff08;绿电运营&#xff09;、西昌电力&…

计算机组成原理:指令系统

计算机组成原理:指令集系统 指令集体系结构(ISA)ISA定义ISA包含的内容举个栗子指令的基本组成(操作码+地址码)指令分类:地址码的个数定长操作码变长操作码变长操作码的原则变长操作码的设计指令寻址寻址方式的目的寻址方式分类有效地址直接在指令中给出有效地址间接给出有效地…

【Go语言】RPC 使用指南(初学者版)

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;允许程序调用另一台计算机上的子程序&#xff0c;就像调用本地程序一样。Go 语言内置了 RPC 支持&#xff0c;下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…

Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)

一、引言 深度学习的重要性 深度学习是一种通过模拟人脑神经元结构来进行数据学习和模式识别的技术&#xff0c;在分类任务中展现出强大的能力。 分类任务的多样性 分类任务涵盖了各种场景&#xff0c;例如簇分类、圆环分类和月牙分类&#xff0c;每种任务都有不同的…

uniapp-商城-38-shop 购物车 选好了 进行订单确认4 配送方式1

配送方式在订单确认页面最上方&#xff0c;可以进行选中配送还是自提&#xff0c;这里先看看配送。 代码样式&#xff1a; 可以看出来是通过组件来实现的。组件名字是&#xff1a;delivery-layout 1、建立组件文件夹和页面&#xff0c;delivery-layout这里就只有配送 2、具体…

uniappx 打包配置32位64位x86安装包

{"app": {"distribute": {"android": {"abiFilters": ["armeabi-v7a","arm64-v8a","x86","x86_64"]}}} }

【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)

Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning&#xff1f; 在传统的强化学习 (Reinforcement Learning, RL) 中&#xff0c;奖励函数是已知的&#xff0c;智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…