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.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的理解相关推荐
- optimizer.zero_grad()和loss.backward()
1.optimizer.zero_grad()和loss.backward()先后问题 刚开始学习深度学习,就是不明白,为什么第一次运行的时候就要optimizer.zero_grad()(梯度清零) ...
- pytorch中使用TensorBoard进行可视化Loss及特征图
pytorch中使用TensorBoard进行可视化Loss及特征图 安装导入TensorBoard 安装TensorBoard pip install tensorboard 导入TensorBoa ...
- model.train()、model.eval()、optimizer.zero_grad()、loss.backward()、optimizer.step作用及原理详解【Pytorch入门手册】
1. model.train() model.train()的作用是启用 Batch Normalization 和 Dropout. 如果模型中有BN层(Batch Normalization)和D ...
- optimizer.zero_grad(),loss.backward(),optimizer.step()的作用原理
目录 前言 一.optimizer.zero_grad() 二. loss.backward() 三.optimizer.step() 前言 在用pytorch训练模型时,通常会在遍历epochs的过 ...
- python grad_PyTorch中model.zero_grad()和optimizer.zero_grad()用法
废话不多说,直接上代码吧~ model.zero_grad() optimizer.zero_grad() 首先,这两种方式都是把模型中参数的梯度设为0 当optimizer = optim.Opti ...
- Pytorch:optim.zero_grad()、pred=model(input)、loss=criterion(pred,tgt)、loss.backward()、optim.step()的作用
在用pytorch训练模型时,通常会在遍历epochs的每一轮batach的过程中依次用到以下三个函数 optimizer.zero_grad(): loss.backward(): optimize ...
- optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
optimizer.zero_grad,loss.backward,optimizer.step 用法介绍 optimizer.zero_grad(): loss.backward(): optimi ...
- Pytorch中的梯度知识总结
文章目录 1.叶节点.中间节点.梯度计算 2.叶子张量 leaf tensor (叶子节点) (detach) 2.1 为什么需要叶子节点? 2.2 detach()将节点剥离成叶子节点 2.3 什么 ...
- pytorch loss不下降_【他山之石】pytorch中optimizer对loss的影响
"他山之石,可以攻玉",站在巨人的肩膀才能看得更高,走得更远.在科研的道路上,更需借助东风才能更快前行.为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟& ...
最新文章
- 假如计算机是中国人发明的,那代码应该这么写
- 两代“狗”开发者首次解答30多个问题,一定有你想了解的!(附论文下载)
- 界面Hello world
- PHP CURL 哈哈哈哈哈记录一下
- openlayers基础(一)——Map
- 什么是GDT,LDT,GDTR及LDTR?
- ZOJ 1292 Integer Inquiry
- php yii model,Yii模型
- iphone彻底删除照片如何恢复_手机删除的照片如何恢复?OPPO最新照片恢复
- mysql使用游标删除数据库_mysql 使用游标进行删除操作的存储过程
- Just For Fun:在windows下模拟一个windows病毒软件(windows.h)
- 可重构计算芯片是未来吗?开发者如何抓住这一机会
- iOSpush过后返回多级界面
- 如何修改网页视频播放倍速?(最高16倍速)
- 实时获取SDN网络拓扑中交换机流表项的思路
- Window10下VS2019编译 Chromium
- Settings学习总结(一)
- 常见安全产品默认口令
- 解决、鼠标间歇性、自动断开、又重连(有图)
- gitlab 上传和下载