PyTorch中model.zero_grad()和optimizer.zero_grad()用法


Posted in Python onJune 24, 2020

废话不多说,直接上代码吧~

model.zero_grad()
optimizer.zero_grad()

首先,这两种方式都是把模型中参数的梯度设为0

当optimizer = optim.Optimizer(net.parameters())时,二者等效,其中Optimizer可以是Adam、SGD等优化器

def zero_grad(self):
 """Sets gradients of all model parameters to zero."""
 for p in self.parameters():
  if p.grad is not None:
  p.grad.data.zero_()

补充知识:Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解

引言

一般训练神经网络,总是逃不开optimizer.zero_grad之后是loss(后面有的时候还会写forward,看你网络怎么写了)之后是是net.backward之后是optimizer.step的这个过程。

real_a, real_b = batch[0].to(device), batch[1].to(device)

fake_b = net_g(real_a)
optimizer_d.zero_grad()

# 判别器对虚假数据进行训练
fake_ab = torch.cat((real_a, fake_b), 1)
pred_fake = net_d.forward(fake_ab.detach())
loss_d_fake = criterionGAN(pred_fake, False)

# 判别器对真实数据进行训练
real_ab = torch.cat((real_a, real_b), 1)
pred_real = net_d.forward(real_ab)
loss_d_real = criterionGAN(pred_real, True)

# 判别器损失
loss_d = (loss_d_fake + loss_d_real) * 0.5

loss_d.backward()
optimizer_d.step()

上面这是一段cGAN的判别器训练过程。标题中所涉及到的这些方法,其实整个神经网络的参数更新过程(特别是反向传播),具体是怎么操作的,我们一起来探讨一下。

参数更新和反向传播

PyTorch中model.zero_grad()和optimizer.zero_grad()用法

上图为一个简单的梯度下降示意图。比如以SGD为例,是算一个batch计算一次梯度,然后进行一次梯度更新。这里梯度值就是对应偏导数的计算结果。显然,我们进行下一次batch梯度计算的时候,前一个batch的梯度计算结果,没有保留的必要了。所以在下一次梯度更新的时候,先使用optimizer.zero_grad把梯度信息设置为0。

我们使用loss来定义损失函数,是要确定优化的目标是什么,然后以目标为头,才可以进行链式法则和反向传播。

调用loss.backward方法时候,Pytorch的autograd就会自动沿着计算图反向传播,计算每一个叶子节点的梯度(如果某一个变量是由用户创建的,则它为叶子节点)。使用该方法,可以计算链式法则求导之后计算的结果值。

optimizer.step用来更新参数,就是图片中下半部分的w和b的参数更新操作。

以上这篇PyTorch中model.zero_grad()和optimizer.zero_grad()用法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
使用 python pyautogui实现鼠标键盘控制功能
Aug 04 Python
python多线程分块读取文件
Aug 29 Python
pytorch 求网络模型参数实例
Dec 30 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
信号生成及DFT的python实现方式
Feb 25 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
Python 统计序列中元素的出现频度
Apr 26 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 #Python
你需要学会的8个Python列表技巧
Jun 24 #Python
pytorch实现查看当前学习率
Jun 24 #Python
在pytorch中动态调整优化器的学习率方式
Jun 24 #Python
CentOS 7如何实现定时执行python脚本
Jun 24 #Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 #Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
Jun 24 #Python
You might like
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
jQuery 1.0.2
2006/10/11 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
ExtJS TabPanel beforeremove beforeclose使用说明
2010/03/31 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
使用纯javascript实现放大镜效果
2015/03/18 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
JavaScript类的写法
2016/09/17 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
python进阶教程之词典、字典、dict
2014/08/29 Python
python中的代码编码格式转换问题
2015/06/10 Python
Python连接DB2数据库
2016/08/27 Python
python3大文件解压和基本操作
2017/12/15 Python
Python通过调用mysql存储过程实现更新数据功能示例
2018/04/03 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
如何用python批量调整视频声音
2020/12/22 Python
手工制作的意大利礼服鞋:Ace Marks
2018/12/15 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
班级聚会策划书
2014/01/16 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
预备党员半年考察意见
2015/06/01 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers