深度学习(学习率)

news/2025/1/17 5:53:30/文章来源:https://www.cnblogs.com/tiandsp/p/18327978

Pytorch做训练的时候,可以调整训练学习率。

通过调整合适的学习率曲线可以提高模型训练效率和优化模型性能。

各种学习率曲线示例代码如下:

import torch
import torch.optim as optim
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as npif __name__ == '__main__':lr_init = 0.5   #初始学习率parameter = [nn.Parameter(torch.tensor([1, 2, 3], dtype=torch.float32))]optimizer = optim.SGD(parameter, lr=lr_init)scheduler_list=[]#每迭代step_size次,学习率乘以gammascheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.5)scheduler_list.append(scheduler)#在迭代到millestones次时,学习率乘以gammascheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=[20,40,80], gamma=0.5)scheduler_list.append(scheduler)#每次学习率是上一次的gamma倍scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9) scheduler_list.append(scheduler)#前total_inters次迭代,学习率从lr_init*(start_factor~end_factor)线性下降,total_iters次之后稳定在end_factorscheduler = torch.optim.lr_scheduler.LinearLR(optimizer,start_factor=1,end_factor=0.01,total_iters=50)scheduler_list.append(scheduler)#学习率在base_lr~max_lr之间循环,上升step_size_up个周期,下降step_size_down个周期scheduler = torch.optim.lr_scheduler.CyclicLR(optimizer,base_lr=0.01,max_lr=0.1,step_size_up=10,step_size_down=30)scheduler_list.append(scheduler)#学习率为cos曲线,T_max为半个周期,最小为eta_min,最大为lr_initscheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer,T_max=20,eta_min=0.1)scheduler_list.append(scheduler)#cos退火学习率,第一个周期为T_0,后面每一个周期为前一个的T_mult倍,最小值为eta_min,最大值为lr_initscheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=10, T_mult=2, eta_min=0.01)scheduler_list.append(scheduler)#学习率先上升后下降,pct_start学习率上升部分占比,最大学习率=max_lr,初始学习率=max_lr/div_factor,最终学习率=初始学习率/final_div_factorscheduler = torch.optim.lr_scheduler.OneCycleLR(optimizer,max_lr=0.1,pct_start=0.2,total_steps=100,div_factor=10,final_div_factor=5)scheduler_list.append(scheduler)#total_iters次以内学习率为lr_init,total_iters之后学习率为lr_init/factorscheduler = torch.optim.lr_scheduler.ConstantLR(optimizer,factor=0.5,total_iters=50)scheduler_list.append(scheduler)#多个学习率组合,将学习率在milestones次循环处分割为两端scheduler = torch.optim.lr_scheduler.SequentialLR(optimizer,schedulers=[torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.9),torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.5)],milestones=[50])scheduler_list.append(scheduler)#同样多种学习率组合,可以给出连续学习率scheduler = torch.optim.lr_scheduler.ChainedScheduler([torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99),torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.5)])scheduler_list.append(scheduler)#自定义lambda函数设定学习率,这里是lr_init * 1.0/(step+1)scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda step: 1.0 /(step+1))scheduler_list.append(scheduler)#自定义lambad函数设定学习率,这里是lr[t] = 0.95*lr[t-1]scheduler = torch.optim.lr_scheduler.MultiplicativeLR(optimizer,lr_lambda=lambda epoch:0.95)scheduler_list.append(scheduler)#当指标度量停止改进时,ReduceLROnPlateau会降低学习率,scheduler.step中需要设置loss参数# scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,mode='min',factor=0.5,patience=5,threshold=1e-4,threshold_mode='abs',cooldown=0,min_lr=0.001,eps=1e-8)# scheduler_list.append(scheduler)
learning_rates = []for sch in scheduler_list:rates=[]optimizer.param_groups[0]['lr'] = lr_initfor _ in range(100):optimizer.step()sch.step()rates.append(sch.get_last_lr()[0])learning_rates.append(rates)numpy_rates = np.array(learning_rates)for i in range(numpy_rates.shape[0]):plt.subplot(4,4,i+1)plt.plot(numpy_rates[i,:])          plt.show()

各种学习率曲线如下:

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

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

相关文章

程序的链接和装入

程序的链接和装入思考这样一个问题,逻辑地址是在链接时形成的还是在装入时形成的。应该是在链接时就已经形成了逻辑地址,后面的装入确定了物理地址C语言编译的过程 C语言编译分为预处理、编译、汇编和链接四个过程 预处理 预处理用于将所有的#include头文件以及宏定义替换为其…

NewStarCTF WEEK5|WEB 4-复盘

打开题目研究一圈没啥营养价值 下载源码发现好东西if (file_exists($page)) {require_once $page; }else{require_once pages/error_page.php;}活的文件包含 我们直接利用 ?+config-create+/&page=../../../../../usr/local/lib/php/pearcmd&/<?=@eval($_POST[a])…

VS2022+Qt6环境问题汇总

1、安装Qt6时无open source模式只有商业模式Qt账号注册问题,注册时没有选择个人模式,需要重新注册账号 1、无法打开.ui文件扩展-->Qr VS Tool-->OptionsRun in detached windows 选择 True

【攻防技术系列+SQL注入】mysql靶场1.0

墨者靶场(SQL手工注入漏洞测试(MySQL数据库))工具 dirsearch sqlmappython dirsearch.py -u http://<IP>:<端口>/在登录界面,没有账户和密码,也进不去,就在没啥收获的时候,直觉告诉我要打开F12开发者模式,这次信它,就在东点点西点点的时候,我发现了什么。…

mysql数据库查询时用到的分页方法有哪些

在处理数据库查询时,我们经常需要对结果进行分页,以便在用户界面上提供更好的浏览体验。MySQL提供了几种不同的方法来实现这一功能,其中最常见的是使用LIMIT子句。以下是三种使用LIMIT进行分页的基本方法。 一、使用LIMIT子句LIMIT子句用于指定查询结果的最大记录数。它的基…

【攻防技术系列+SQL注入】mysql靶场

墨者靶场(SQL手工注入漏洞测试(MySQL数据库))工具 dirsearch sqlmappython dirsearch.py -u http://<IP>:<端口>/在登录界面,没有账户和密码,也进不去,就在没啥收获的时候,直觉告诉我要打开F12开发者模式,这次信它,就在东点点西点点的时候,我发现了什么。…

从汇编层面看c/c++函数调用过程

函数调用分析 前置知识:全局变量:在函数内部定义的变量 局部变量:在函数外部定义的变量 esp:存储当前函数栈底的地址 ebp:存储当前函数栈顶的地址对于函数形参(实际上):简单:cpu寄存器中 复杂:栈中开空间函数调用机制:局部变量占用的内存是在程序执行过程中“动态”…

算法理论:KMP 学习笔记

\(\text{KMP}\) 笔记! 上次比赛,出题人出了一个 \(\text{KMP}\) 模板,我敲了个 \(\text{SAM}\) 跑了,但是学长给的好题中又有很多 \(\text{KMP}\),于是滚回来恶补字符串基本算法。 \(\text{KMP}\) 是上个寒假学的,为什么最近才完全理解,但 \(\text{KMP}\) 短小精悍,极其…

c/c++函数调用过程(结合汇编指令详细分析)

函数调用分析 前置知识:全局变量:在函数内部定义的变量 局部变量:在函数外部定义的变量 esp:存储当前函数栈底的地址 ebp:存储当前函数栈顶的地址对于函数形参(实际上):简单:cpu寄存器中 复杂:栈中开空间函数调用机制:局部变量占用的内存是在程序执行过程中“动态”…

vs2015卸载和安装

vs2015卸载和安装 0. 摘要 可能对大家有帮助的地方:a. vs2015卸载和安装的流程;b. 安装时的error:“team explorer for microsoft visual studio 2015 update 3 ctp1 error” 解决方式;c. vs2015社区版的下载地址; 如果这三点不能解决你遇到的问题,就没必要往下看了。 1. …

CSP13

T1本来是道状压签到题,看成博弈论了,其实是不对的,为什么不对,建图时是存在环的情况的,所以不能建一棵树后跑\(sg\)函数 所以根据数据范围,我们可以状压,这就很简单了,每一次继承的状态为子状态相反的状态(不要试图只表示赢得状态)考试代码(41,43)pts #include <bits…