PyTorch中的model.zero_grad() vs optimizer.zero_grad()
时间:2022-07-26
本文章向大家介绍PyTorch中的model.zero_grad() vs optimizer.zero_grad(),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书
1. 引言
在PyTorch中,对模型参数的梯度置0时通常使用两种方式:model.zero_grad()
和optimizer.zero_grad()
。二者在训练代码都很常见,那么二者的区别在哪里呢?
2. model.zero_grad()
model.zero_grad()
的作用是将所有模型参数的梯度置为0。其源码如下:
for p in self.parameters():
if p.grad is not None:
p.grad.detach_()
p.grad.zero_()
3. optimizer.zero_grad()
optimizer.zero_grad()
的作用是清除所有优化的torch.Tensor
的梯度。其源码如下:
for group in self.param_groups:
for p in group['params']:
if p.grad is not None:
p.grad.detach_()
p.grad.zero_()
4. 总结
- 当使用
optimizer = optim.Optimizer(net.parameters())
设置优化器时,此时优化器中的param_groups
等于模型中的parameters()
,此时,二者是等效的,从二者的源码中也可以看出来。 - 当多个模型使用同一个优化器时,二者是不同的,此时需要根据实际情况选择梯度的清除方式。
- 当一个模型使用多个优化器时,二者是不同的,此时需要根据实际情况选择梯度的清除方式。
References
- https://discuss.pytorch.org/t/model-zero-grad-or-optimizer-zero-grad/28426
- https://discuss.pytorch.org/t/whats-the-difference-between-optimizer-zero-grad-vs-nn-module-zero-grad/59233
- https://discuss.pytorch.org/t/zero-grad-optimizer-or-net/1887
- https://pytorch.org/docs/stable/optim.html
- https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module
- Linux下MySQL的彻底卸载和安装配置字符集
- Codeforces 626F Group Projects(滚动数组+差分dp)
- Vijos P1103 校门外的树【线段树,模拟】
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
- SQL vs NoSQL:如何选择?
- 线性规划之单纯形法【超详解+图解】
- NodeJS 应用仓库钓鱼
- Codeforces 626D Jerry's Protest(暴力枚举+概率)
- CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】
- Uva 10339 - Watching Watches【数论,暴力】
- Codeforces 626E Simple Skewness(暴力枚举+二分)
- 如何启用Windows 10客户端Hyper-V
- 51Nod 1632 B君的连通(递归,快速幂)
- 51Nod 1046 A^B Mod C(日常复习快速幂)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法