pytorch基础(四):使用optim优化函数

article/2025/9/16 20:59:00

文章目录

  • 前言
  • 一、问题描述
  • 二、官方文档代码
  • 三、optimizer的工作原理
  • 总结


前言

  本系列主要是对pytorch基础知识学习的一个记录,尽量保持博客的更新进度和自己的学习进度。本人也处于学习阶段,博客中涉及到的知识可能存在某些问题,希望大家批评指正。另外,本博客中的有些内容基于吴恩达老师深度学习课程,我会尽量说明一下,但不敢保证全面。


一、问题描述

  此次需要构建的神经网络其实和前几次相同,为了能更直观的理解问题,绘制了一张精美的神经网络结构图:
在这里插入图片描述
  到目前为止,我们已经使用了numpy,tensor,Pytorch自动求导以及Pytorch的nn模块来实现同一个神经网络。
  我们在nn的基础上使用优化算法来对神经网络进行优化,看过吴恩达老师深度学习课程的应该对优化算法有大致了解,一般来说有三种:动量梯度下降法(Momentum)、RMSprop算法和Adam优化算法。
  每个优化算法有对应的数学公式,在这里就不细说了。需要明白的是,这些优化算法主要改变反向传播后的参数更新环节,目的是在于加快神经网络的训练过程。

二、官方文档代码

  Pytorch已经将优化算法封装成optim包,我们要做的是把需要优化的参数以及使用到的学习率传入函数中即可。

import torchN, D_in, H, D_out = 64, 1000, 100, 10x = torch.randn(N, D_in)
y = torch.randn(N, D_out)# 定义神经网络需要计算的层
model = torch.nn.Sequential(torch.nn.Linear(D_in, H),torch.nn.ReLU(),torch.nn.Linear(H, D_out))# 定义神经网络的损失函数
loss_fn = torch.nn.MSELoss(reduction="sum")learning_rate = 1e-4
# 定义使用的优化算法,这里使用的的是Adam优化算法
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)for t in range(500):# 前向传播y_pred = model(x)# 计算损失loss = loss_fn(y_pred, y)print(t, loss.item())# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 参数更新optimizer.step()

  上述代码与之前代码的差别在于使用到了优化器,并且参数的更新去梯度的清零都是在优化器的基础上完成的。接下来我会浅析一下optimizer的工作原理,为什么是"浅析",是因为我不太懂其更底层的代码。

三、optimizer的工作原理

optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

  我们通过上述代码初始化了一个优化器,该优化器使用的是Adam优化算法,optim包里面还包含了其他优化算法。初始化时我们将我们定义的神经网络中的参数传入优化器中,并传入我们定义的学习率。
  然后在反向传播完成后,调用optim包中的step()方法完成参数更新:

 # 参数更新optimizer.step()

  这里我产生了一个疑问:为什么调用optim包中的函数,会对model对象中的属性进行更新。
  在前面我们知道,model.parameters()会返回一个迭代器,对这个迭代器遍历可以依次得到神经网络中的参数,也就是w1,b1,w2,b2。我们打印这四个值的id号:

pa = model.parameters()
for param in pa:print(id(param))

结果如下:

2268871549080
2268871549160
2268871549240
2268871549320

  我们查看 torch.optim.Adam() 返回值 optimizer 的属性:
在这里插入图片描述
  optimizer有列表类型的属性 param_groups ,其长度为1。查看列表中的元素,发现是一个字典类型的数据,该字典类型数据底下有key值为"params"的项,其value的值为一个列表,让我们打印列表中元素的id值:

for param2 in optimizer.param_groups[0]["params"]:print(id(param2))

结果如下:

2017646698648
2017646698728
2017646698808
2017646698888

  可以看出,打印结果与上面打印的model.parameters()中参数id值完全相同,这就解释了为什么调用optim中的方法会对model中的属性产生改变。至于为什么会这样,个人推测是采用了深复制,所以requires_grad属性的值也为True,感兴趣的可以去看看源码。
  关于使用 step() 更新参数的原理,我暂时还未弄明白,但是查阅相关资料后了解到,optim的所有优化函数均有step()方法。

总结

  使用Pytorch的优化器 optim 的大致步骤为:定义一个需要的优化器,并传入需要优化的参数和优化使用到的学习率;在反向传播前利用优化器对参数梯度进行清零;反向传播结束后利用优化器对参数进行更新。可以看出,使用优化器后,对神经网络参数的操作可以直接在优化器上进行。


http://chatgpt.dhexx.cn/article/CTKOtp8Q.shtml

相关文章

HTTP协议之GET与POST区别

GET和POST是HTTP请求的两种基本方式,对于这两种请求方式的区别,只要是接触过Web开发的就能说出一二:GET把参数包含在URL中,POST通过正文传参! 而我想深入了解以下的时候,就去了w3cschool,这是w…

Get和Post区别是什么

附上原文地址:https://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。…

get与post区别(很全~)

get与post区别 GET: (1)从指定的资源请求数据 (2)请求数据有长度限制(不同每个浏览器限制长度可能不一样) (3)请求url会在浏览器地址栏中显示 (4&#x…

Web中get和post区别

99% 的人都理解错了 HTTP 中 GET 与 POST 的区别(转) 转自:WebTechGarden 微信公众号GET 和 POST 是 HTTP 请求的两种基本方法,要说它们的区别,接触过 WEB 开发的人都能说出一二。最直观的区别就是 GET 把参数包含在 U…

get,post区别

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而H…

GET 与 POST 区别

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

GET和POST区别及缓存问题

2.就是get和post区别的缓存问题。 首先要了解什么是缓存。 HTTP缓存的基本目的就是使应用执行的更快,更易扩展,但是HTTP缓存通常只适用于idempotent request(可以理解为查询请求,也就是不更新服务端数据的请求)&#x…

Get与Post区别与范例讲解

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 一、 J2EE WEB应用文件目录结构 Java Web应用由一组静态HTML页、Servlet、JSP和其他相关的class组成,它们一起构成一个大的工程项目。每种组件在Web应用中都有固定的存放目录。Web应用的配…

GET和POST区别详解

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

get和post区别

GET和POST的安全性 1、GET是通过URL方式请求,可以直接看到,明文传输 2、POST是通过请求header请求,可以开发者工具或者抓包可以看到,同样也是明文的 3、GET请求会保存在浏览器历史纪录中,还可能会保存在Web的日志中 G…

post和get区别

GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二。 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。 你可能自己写过无数个GET和POST请求,或者已经看过很多权威网站总结出…

GET 和 POST 有什么区别?

GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发的 RESTful 接口中,都能看到它们的身影。而它们之间的区别,也是一道常见且经典的面试题,所以我们本文就来详细的聊聊。 HTTP 协议定义的方法类型总共有以下 10 种&…

查找(一)——静态查找表

目录 一、查找的基本概念 二、顺序查找 (线性查找) 1、基本思想 2、核心代码 3、顺序查找设置哨兵 4、顺序查找的优点: 5、顺序查找的缺点: 6、折半查找 7、折半查找判定树 8、线性表查找的特点 三、索引顺序表&#x…

查找表结构

查找表介绍 在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的数据结构——查找表。 查找表是由同一类型的数据元素构成的集合。例如电话号…

数据结构 第八章 查找(静态查找表)

集合 1、集合中的数据元素除了属于同一集合外,没有任何的逻辑关系 2、在集合中,每个数据元素都有一个区别于其他元素的唯一标识(键值或者关键字值) 3、集合的运算: 1 查找某一元素是否存在(内部查找、外部查找) 2 将集合中的元素按照它的唯一标识进行排序4、集合的…

9.1 查找表:静态查找表

9.1 查找表:静态查找表. 9.2 查找表:动态查找表. 9.3 查找表:哈希表. 9.1 查找表:静态查找表 1 基本概念2 抽象数据类型3 顺序查找表3.1 顺序存储结构模块中的实现3.2 分析顺序查找的时间性能. 4 有序查找表4.1 代码实现4.2 折半查…

数据结构----查找表

前言 突然发现自己过得茫茫然,学过的东西,似懂非懂,不知所以。昨晚打开以前瞎写 的博客,又来了兴趣。 人在反思中成长,在总结中进步。加油!目录 前言 查找表 正文静态查找表顺序查找表有序查找表索引查找表…

sql server查找表的字段信息

查找表的字段信息 SELECT (case when a.colorder1 then d.name else end) N表名, a.colorder N字段序号, a.name N字段名, (case when COLUMNPROPERTY( a.id,a.name,IsIdentity)1 then √else end) N标识, (case when (SELECT count(*) FROM sysobjects WHERE (name in (SEL…

算法——查找表

查找,根据一个值查找另一个值,value值可以是容器,结构,这样可查找的元素就更多; 哈希冲突: 主关键字:可以唯一的标识一个记录的关键字,如准考证号; 此关键词&#xff…

LUT 查找表(Look-Up-Table)

LUT就是查找表,对于4输入的LUT而言,实际上就是4位地址位,一位数据位的存储器,能够存储16位数据,所以我们在FPGA设计中可以用LUT组建分布式的RAM。 如果用传统的逻辑来实现一个4输入的逻辑电路,需要大致三个…