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

作者:血雨腥风霜 时间:2023-09-15 20:13:57 

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

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的参数更新操作。

来源:https://blog.csdn.net/weixin_41466947/article/details/89203231

标签:PyTorch,model,zero,grad,optimizer
0
投稿

猜你喜欢

  • Python3 操作符重载方法示例

    2021-03-18 11:38:03
  • selenium+python自动化测试之使用webdriver操作浏览器的方法

    2023-06-28 03:04:47
  • JS实现在文本指定位置插入内容的简单示例

    2024-04-19 10:15:17
  • Golang中goroutine和channel使用介绍深入分析

    2023-07-07 16:51:48
  • 没有sa密码无法集成windows身份验证登录的解决方法

    2024-01-14 11:23:01
  • 解决selenium模块利用performance获取network日志请求报错的问题(亲测有效)

    2022-12-22 11:09:26
  • 在select语句中使用top的一些小技巧

    2009-03-12 12:21:00
  • python数据结构leetcode338比特位计数算法

    2023-05-06 21:24:33
  • asp.net下降文本格式数据导入到数据库中的代码

    2024-01-21 16:13:04
  • python 对dataframe下面的值进行大规模赋值方法

    2022-01-08 07:04:19
  • PHP PDOStatement::getColumnMeta讲解

    2023-06-22 08:34:14
  • python跳出双层for循环的解决方法

    2022-12-25 18:55:37
  • Sql中将datetime转换成字符串的方法(CONVERT)

    2024-01-22 10:25:59
  • python输入、数据类型转换及运算符方式

    2021-08-09 19:20:17
  • MYSQL自定义函数判断是否正整数的实例代码

    2024-01-19 19:14:20
  • Python拼接字符串的7种方法总结

    2022-10-28 08:38:00
  • python爬虫之request模块深入讲解

    2021-09-21 00:35:51
  • Ubuntu20下的Django安装的方法步骤

    2022-05-01 09:07:24
  • 实现div可编辑的常见方法

    2007-11-06 12:02:00
  • pytorch模型的保存加载与续训练详解

    2022-03-27 08:45:08
  • asp之家 网络编程 m.aspxhome.com