常用组件详解(九):学习率更新策略

news2024/11/24 8:52:31

文章目录

  • 1.StepLR
  • 2.MultiStepLR
  • 3.ExponentialLR
  • 4.LinearLR
  • 5.PloyLR


  适合的学习率能够更好地训练模型,为此衍生出多种学习率调整策略。一般来说,在训练初期希望学习率大一些,使得网络收敛迅速,在训练后期希望学习率小一些,使得网络更好的收敛到最优解。在torch.optim.lr_scheduler包下提供了大量的学习率调整模块,如StepLRMultiStepLRExponentialLRCosineAnnealingLR。对学习率的更新由学习率更新对象执行step()完整,多数情况下,每一个epoch后都会进行学习率的更新,框架如下:

scheduler = ...
for epoch in range(100):
	train(...)
	validate(...)
	scheduler.step()

前置代码如下,学习率设为0.1:

import torch
import numpy as np
from torch.optim import SGD
from torch.optim import lr_scheduler
from torch.nn.parameter import Parameter

model = [Parameter(torch.randn(2, 2, requires_grad=True))]
optimizer = SGD(model, lr=0.1)

1.StepLR

  StepLR(固定步长衰减)策略,每过step_size轮,将学习率乘以gamma

lr_scheduler.StepLR(optimizer,step_size,gamma,last_epoch=-1)

【例子】

scheduler=lr_scheduler.StepLR(optimizer, step_size=50, gamma=0.1)

在这里插入图片描述

2.MultiStepLR

  MultiStepLR(多步长衰减)策略,StepLR(固定步长衰减)策略只能按照固定的区间步长更新学习率,而MultiStepLR(多步长衰减)策略可定义动态区间以更新学习率。

lr_scheduler.MultiStepLR(optimizer,milestones,gamma,last_epoch=-1)

【例子】

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[30,80], gamma=0.5)
  • milestones=[30,80]:在30、80轮时更新学习率(乘以gamma),其他轮次不更新。

在这里插入图片描述

3.ExponentialLR

  ExponentialLR(指数衰减)策略,每一轮都会将学习率乘以gamma,等价于:
l r = l r ∗ g a m m a e p o c h lr=lr*gamma^{epoch} lr=lrgammaepoch

lr_scheduler.ExponentialLR(optimizer,milestones,gamma,last_epoch=-1)

【例子】

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

在这里插入图片描述

4.LinearLR

  LinearLR(线性衰减)策略,给定学习率的初始值、最终值(最终值需指定最后更新时的轮次),LinearLR策略会在中间阶段做线性插值,自动选择更新轮次进行更新。

scheduler=lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.1,total_iters=80)

在这里插入图片描述

5.PloyLR

  PloyLR策略是自定义的学习率调整策略,计算方式如下:
在这里插入图片描述
有如下优点:

  • 1.更好的泛化能力:Poly学习率调整策略可以在训练后期逐渐降低学习率,避免过拟合,提高模型的泛化能力。
  • 2.对超参数不敏感:Poly学习率调整策略的性能不太受超参数的影响,相对比较稳定。
  • 3.计算量较小:Poly学习率调整策略的计算量相对较小,不会影响训练速度。

缺点包括:

  • 1.收敛速度较慢:Poly学习率调整策略在训练初期学习率较低,收敛速度较慢。
  • 2.不适用于所有模型:Poly学习率调整策略可能不适用于所有类型的模型,需要根据具体情况进行选择。
from torch.optim.lr_scheduler import _LRScheduler, StepLR

class PolyLR(_LRScheduler):
    def __init__(self, optimizer, max_iters, power=0.9, last_epoch=-1, min_lr=1e-6):
        self.power = power
        self.max_iters = max_iters  # avoid zero lr
        self.min_lr = min_lr
        super(PolyLR, self).__init__(optimizer, last_epoch)
    
    def get_lr(self):
        return [ max( base_lr * ( 1 - self.last_epoch/self.max_iters )**self.power, self.min_lr)
                for base_lr in self.base_lrs]

【例子】

LR = 0.1        
iteration = 50
max_epoch = 1000 
weights = torch.randn((1), requires_grad=True)
target = torch.zeros((1))
optimizer = SGD([weights], lr=LR, momentum=0.9)

# flag = 0
flag = 1
if flag:
    scheduler_lr = PolyLR(optimizer, 1000, power=0.9) 
    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="Poly LR Scheduler")
    plt.xlabel("Epoch")
    plt.ylabel("Learning rate")
    plt.legend()
    plt.show()

在这里插入图片描述

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

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

相关文章

jmeter学习(4)提取器

同线程组https://blog.csdn.net/vikeyyyy/article/details/80437530 不同线程组 在JMeter中,正则表达式提取的参数可以跨线程组使用。 通过使用Beanshell后置处理器和属性设置函数,可以将提取的参数设置为全局变量,从而在多个线程组之间共享…

Spring Boot新闻推荐系统设计与实现

3系统分析 3.1可行性分析 通过对本新闻推荐系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本新闻推荐系统采用JAVA作为开发语言,Spring Boot框…

Go语言实现长连接并发框架 - 开篇

文章目录 前言初步设计思路初步架构图项目地址最后 前言 你好,我是醉墨居士,国庆假期闲来无事,准备使用Go语言开发一个轻量级的长连接并发框架,希望能够帮助大家掌握这类框架的心脏与内核,也希望能给大伙带来灵感与启…

【微服务】负载均衡 - LoadBalance(day4)

下述所有代码都是在订单服务中修改的,商品服务并不需要修改,只需要启动多个实例即可。 引入 在介绍Eureka组件的最后,留下了一个问题就是,无论启动多少个实例,只能调用第一个。原因是因为服务调用时获取的是一个实例…

C/C++/EasyX——入门图形编程(3)

【说明】上一篇讲了基础图形的绘制,那么这一篇就来讲一下如何在窗口上绘制文字吧,友友们一起学习吧。(>y<)(^v^) 一:文字…

jQuery——对象的过滤

在 jQuery 对象中的元素对象数组中过滤出一部分元素来 ① first() ② last() ③ eq(index / -index) ④ filter(selector):对当前元素提要求 ⑤ not(sel…

电脑IP地址怎么换成二进制:详解转换过程与应用

在电脑网络的世界里,IP地址是每台设备独一无二的身份标识。而我们日常所见的IP地址,大多是以点分十进制的形式呈现。然而,在电脑内部,IP地址实际上是以二进制的形式进行存储和处理的。那么,电脑IP地址怎么换成二进制呢…

pygame入门(千字详细版)

千字赘述,万字总结,就为博客点一赞吧! 1.安装pygame pip install pygame 安装完成后在python中输入检验有没有问题,回车键应该不会报错。 >>>import pygame >>>2.pygame模块预览 3.项目实战 3.1.0 hello w…

一键开启高清录屏:盘点Windows最火四款录屏工具

嘿,朋友们,今天咱们来聊聊那些让我在电脑前忙活得热火朝天的录屏神器究竟怎么样。作为一个经常需要录制教程、分享游戏精彩瞬间的普通用户,我可是对这几款软件有着满满的体验心得,现在就给你们一一道来。 一、福昕录屏大师 网址…

编码与解码

文章目录 编码与解码一、字节 & 字符二、编码 & 解码三、字符集 & 字符编码四、ASCII五、ISO-8859-1六、GB七、Unicode1、概述2、发展3、UTF-8 编码4、UTF-16 编码 八、Base64 编码1、概述2、原理3、代码示例 九、十六进制编码 编码与解码 一、字节 & 字符 字…

kali下编译AOSP报错(libncurses.so.5: cannot open shared object file)

编译报错信息:libncurses.so.5: cannot open shared object file: No such file or directory /bin/bash -c "PWD/proc/self/cwd prebuilts/clang/host/linux-x86/clang-3289846/bin/clang -Ifr ameworks/rs/script_api/include -Iexternal/clang/lib/Headers …

【AI知识点】小世界网络(Small-World Networks)

小世界网络(Small-World Networks) 是一种具有独特拓扑结构的网络模型,广泛应用于研究社交网络、神经网络、互联网以及其他复杂系统中的节点间连接方式。小世界网络的特点是节点之间的平均路径长度较短,并且大多数节点的局部连接较…

世邦通信股份有限公司IP网络对讲广播系统RCE

漏洞描述 SPON世邦IP网络广播系统采用的IPAudio™技术, 将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输的双向音频扩声系统。传统广播系统存在的音质不佳,传输距离有限,缺乏互动等问题。该系统设备使用简便&#xff0c…

知识图谱入门——7:阶段案例:使用 Protégé、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop 搭建知识图谱

在 Windows 环境中结合使用 Protg、Jupyter Notebook 中的 spaCy 和 Neo4j Desktop,可以高效地实现从自然语言处理(NLP)到知识图谱构建的全过程。本案例将详细论述环境配置、步骤实现以及一些扩展和不足之处。 文章目录 1. 环境准备1.1 Neo4j…

webGL入门(六)图形旋转

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</…

PIDM—— 物理正则化扩散模型

概述 论文地址&#xff1a;https://arxiv.org/pdf/2403.14404 源码地址&#xff1a;https://github.com/jhbastek/physicsinformeddiffusionmodels 扩散模型在逼近非常复杂的数据分布方面具有极高的性能和多功能性&#xff0c;近年来在自然科学领域的应用迅速扩展。鉴于其在科…

两数相除111

1.//给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 //整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。 // 例如&#xff0c;8.345 将被截断为 8 &#xff0…

基于SSM框架和Layui的学院课程安排系统的设计与实现(源码+定制+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

WDG看门狗在stm32中的应用

一&#xff0c;WDG看门狗的介绍 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长时间的罢工状态&#xff0c;保证系统的可靠性和安全性看…

2款.NET开源且免费的Git可视化管理工具

Git是什么&#xff1f; Git是一种分布式版本控制系统&#xff0c;它可以记录文件的修改历史和版本变化&#xff0c;并可以支持多人协同开发。Git最初是由Linux开发者Linus Torvalds创建的&#xff0c;它具有高效、灵活、稳定等优点&#xff0c;如今已成为软件开发领域中最流行…