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 相关文章推荐
python打开文件并获取文件相关属性的方法
Apr 23 Python
Python读取键盘输入的2种方法
Jun 16 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
Python实现查找匹配项作处理后再替换回去的方法
Jun 10 Python
Python实现的弹球小游戏示例
Aug 01 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
Python Numpy:找到list中的np.nan值方法
Oct 30 Python
python-tkinter之按钮的使用,开关方法
Jun 11 Python
Django Rest framework认证组件详细用法
Jul 25 Python
python、PyTorch图像读取与numpy转换实例
Jan 13 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
python之pygame模块实现飞机大战完整代码
Nov 29 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函数
2006/10/09 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
javascript数组去重小结
2016/03/07 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
layui写后台表格思路和赋值用法详解
2019/11/14 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python获取本机所有IP地址的方法
2018/12/26 Python
利用python修改json文件的value方法
2018/12/31 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
python批量图片处理简单示例
2019/08/06 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
物流合作计划书
2014/01/10 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android