对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操作MongoDB基础知识
Nov 01 Python
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
Python devel安装失败问题解决方案
Jun 09 Python
python 实现表情识别
Nov 21 Python
pytorch 使用半精度模型部署的操作
May 24 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
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php readfile下载大文件失败的解决方法
2017/05/22 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
AngularJS快速入门
2015/04/02 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
老生常谈js数据类型
2017/08/03 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
layer.prompt使文本框为空的情况下也能点击确定的方法
2019/09/24 Javascript
[22:20]初生之犊-TI4第5名LGD战队纪录片
2014/08/13 DOTA
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
对Tensorflow中的矩阵运算函数详解
2018/07/27 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
python设置环境变量的作用整理
2020/02/17 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
numpy矩阵数值太多不能全部显示的解决
2020/05/14 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
个人简历自我鉴定
2013/10/11 职场文书
会走路的树教学反思
2014/02/20 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
毕业生见习报告总结
2014/11/08 职场文书
拔河比赛新闻稿
2015/07/17 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
golang DNS服务器的简单实现操作
2021/04/30 Golang
常用的Python代码调试工具总结
2021/06/23 Python