引言

一般训练神经网络,总是逃不开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.5loss_d.backward()
optimizer_d.step()

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

参数更新和反向传播


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

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

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

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

参考

[1Pytorch optimizer.step() 和loss.backward()和scheduler.step()的关系与区别
[2]torch代码解析 为什么要使用optimizer.zero_grad()

Pytorch中的optimizer.zero_grad和loss和net.backward和optimizer.step的理解相关推荐

  1. optimizer.zero_grad()和loss.backward()

    1.optimizer.zero_grad()和loss.backward()先后问题 刚开始学习深度学习,就是不明白,为什么第一次运行的时候就要optimizer.zero_grad()(梯度清零) ...

  2. pytorch中使用TensorBoard进行可视化Loss及特征图

    pytorch中使用TensorBoard进行可视化Loss及特征图 安装导入TensorBoard 安装TensorBoard pip install tensorboard 导入TensorBoa ...

  3. model.train()、model.eval()、optimizer.zero_grad()、loss.backward()、optimizer.step作用及原理详解【Pytorch入门手册】

    1. model.train() model.train()的作用是启用 Batch Normalization 和 Dropout. 如果模型中有BN层(Batch Normalization)和D ...

  4. optimizer.zero_grad(),loss.backward(),optimizer.step()的作用原理

    目录 前言 一.optimizer.zero_grad() 二. loss.backward() 三.optimizer.step() 前言 在用pytorch训练模型时,通常会在遍历epochs的过 ...

  5. python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法

    废话不多说,直接上代码吧~ model.zero_grad() optimizer.zero_grad() 首先,这两种方式都是把模型中参数的梯度设为0 当optimizer = optim.Opti ...

  6. Pytorch:optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用

    在用pytorch训练模型时,通常会在遍历epochs的每一轮batach的过程中依次用到以下三个函数 optimizer.zero_grad(): loss.backward(): optimize ...

  7. optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用

    optimizer.zero_grad,loss.backward,optimizer.step 用法介绍 optimizer.zero_grad(): loss.backward(): optimi ...

  8. Pytorch中的梯度知识总结

    文章目录 1.叶节点.中间节点.梯度计算 2.叶子张量 leaf tensor (叶子节点) (detach) 2.1 为什么需要叶子节点? 2.2 detach()将节点剥离成叶子节点 2.3 什么 ...

  9. pytorch loss不下降_【他山之石】pytorch中optimizer对loss的影响

    "他山之石,可以攻玉",站在巨人的肩膀才能看得更高,走得更远.在科研的道路上,更需借助东风才能更快前行.为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟& ...

最新文章

  1. 假如计算机是中国人发明的,那代码应该这么写
  2. 两代“狗”开发者首次解答30多个问题,一定有你想了解的!(附论文下载)
  3. 界面Hello world
  4. PHP CURL 哈哈哈哈哈记录一下
  5. openlayers基础(一)——Map
  6. 什么是GDT,LDT,GDTR及LDTR?
  7. ZOJ 1292 Integer Inquiry
  8. php yii model,Yii模型
  9. iphone彻底删除照片如何恢复_手机删除的照片如何恢复?OPPO最新照片恢复
  10. mysql使用游标删除数据库_mysql 使用游标进行删除操作的存储过程
  11. Just For Fun:在windows下模拟一个windows病毒软件(windows.h)
  12. 可重构计算芯片是未来吗?开发者如何抓住这一机会
  13. iOSpush过后返回多级界面
  14. 如何修改网页视频播放倍速?(最高16倍速)
  15. 实时获取SDN网络拓扑中交换机流表项的思路
  16. Window10下VS2019编译 Chromium
  17. Settings学习总结(一)
  18. 常见安全产品默认口令
  19. 解决、鼠标间歇性、自动断开、又重连(有图)
  20. gitlab 上传和下载

热门文章

  1. Eboot 中给nandflash分区实现
  2. 一个简单的freemark输入输出的案例(一)
  3. 拥抱对手 微软崛起或靠“云计算”业务
  4. 配置kickstart脚本--图形篇
  5. dtree.js树的使用
  6. poj 1781 In Danger
  7. c语言计算正方体表面积的程序,成都信息工程学院C语言考试题及答案
  8. 谈谈关于个人提升的一些思考
  9. 利用KMP算法判断一个树是否是另一个树的子树
  10. 罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732EM电磁流量计变送器如何接线!