对pytorch中的梯度更新方法详解


Posted in Python onAugust 20, 2019

背景

使用pytorch时,有一个yolov3的bug,我认为涉及到学习率的调整。收集到tencent yolov3和mxnet开源的yolov3,两个优化器中的学习率设置不一样,而且使用GPU数目和batch的更新也不太一样。据此,我简单的了解了下pytorch的权重梯度的更新策略,看看能否一窥究竟。

对代码说明

共三个实验,分布写在代码中的(一)(二)(三)三个地方。运行实验时注释掉其他两个

实验及其结果

实验(三):

不使用zero_grad()时,grad累加在一起,官网是使用accumulate 来表述的,所以不太清楚是取的和还是均值(这两种最有可能)。

不使用zero_grad()时,是直接叠加add的方式累加的。

tensor([[[ 1., 1.],……torch.Size([2, 2, 2])
0 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
tensor([[[ 2., 2.],…… torch.Size([2, 2, 2])
1 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])
2 2 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

实验(二):

单卡上不同的batchsize对梯度是怎么作用的。 mini-batch SGD中的batch是加快训练,同时保持一定的噪声。但设置不同的batchsize的权重的梯度是怎么计算的呢。

设置运行实验(二),可以看到结果如下:所以单卡batchsize计算梯度是取均值的

tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])

实验(一):

多gpu情况下,梯度怎么合并在一起的。

在《training imagenet in 1 hours》中提到grad是allreduce的,是累加的形式。但是当设置g=2,实验一运行时,结果也是取均值的,类同于实验(二)

tensor([[[ 3., 3.],…… torch.Size([2, 2, 2])

实验代码

import torch
import torch.nn as nn
from torch.autograd import Variable


class model(nn.Module):
 def __init__(self, w):
  super(model, self).__init__()
  self.w = w

 def forward(self, xx):
  b, c, _, _ = xx.shape
  # extra = xx.device.index + 1 ## 实验(一)
  y = xx.reshape(b, -1).mm(self.w.cuda(xx.device).reshape(-1, 2) * extra)
  return y.reshape(len(xx), -1)


g = 1
x = Variable(torch.ones(2, 1, 2, 2))
# x[1] += 1 ## 实验(二)
w = Variable(torch.ones(2, 2, 2) * 2, requires_grad=True)
# optim = torch.optim.SGD({'params': x},
lr = 0.01
momentum = 0.9
M = model(w)

M = torch.nn.DataParallel(M, device_ids=range(g))

for i in range(3):
 b = len(x)
 z = M(x)
 zz = z.sum(1)
 l = (zz - Variable(torch.ones(b).cuda())).mean()
 # zz.backward(Variable(torch.ones(b).cuda()))
 l.backward()
 print(w.grad, w.grad.shape)
 # w.grad.zero_() ## 实验(三)
 print(i, b, '* * ' * 20)

以上这篇对pytorch中的梯度更新方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python sys.path详细介绍
Oct 17 Python
python使用PyFetion来发送短信的例子
Apr 22 Python
python转换字符串为摩尔斯电码的方法
Jul 06 Python
常见的python正则用法实例讲解
Jun 21 Python
使用tensorflow实现AlexNet
Nov 20 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
python实现雪花飘落效果实例讲解
Jun 18 Python
python操作excel让工作自动化
Aug 09 Python
python中re模块知识点总结
Jan 17 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 #Python
python爬虫 urllib模块发起post请求过程解析
Aug 20 #Python
pytorch 加载(.pth)格式的模型实例
Aug 20 #Python
python multiprocessing模块用法及原理介绍
Aug 20 #Python
python 并发编程 阻塞IO模型原理解析
Aug 20 #Python
PyTorch中常用的激活函数的方法示例
Aug 20 #Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 #Python
You might like
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
script不刷新页面的联动前后代码
2013/09/18 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JS/jQuery实现超简单的Table表格添加,删除行功能示例
2019/07/31 jQuery
vue实现顶部菜单栏
2020/11/08 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
Python中pygame的mouse鼠标事件用法实例
2015/11/11 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
pyinstaller打包单个exe后无法执行错误的解决方法
2019/06/21 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python实现大学人员管理系统
2019/10/25 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
英国百年闻名的优质健康产品连锁店:Holland & Barrett
2019/12/19 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
历史系毕业生自荐信
2013/10/28 职场文书
自我鉴定注意事项
2014/01/19 职场文书
数学检讨书1000字
2014/02/24 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
通知范文怎么写
2015/04/16 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
运动会1000米加油稿
2015/07/21 职场文书
保外就医申请书范文
2015/08/06 职场文书
心理健康教育主题班会
2015/08/13 职场文书