对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程序运行效率的6个方法
Mar 31 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
基于Python 装饰器装饰类中的方法实例
Apr 21 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
Jun 11 Python
python操作excel的方法
Aug 16 Python
python实现事件驱动
Nov 21 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
NumPy 数组使用大全
Apr 25 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
Python生成随机验证码代码实例解析
Jun 09 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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遍历数组的方法分享
2012/03/22 PHP
php cli 小技巧
2013/06/03 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
2016/09/11 PHP
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
Python创建模块及模块导入的方法
2015/05/27 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python网络应用开发知识点浅析
2019/05/28 Python
python安装pil库方法及代码
2019/06/25 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
python如何运行js语句
2020/09/09 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
AmazeUI 导航条的实现示例
2020/08/14 HTML / CSS
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
外企C语言笔试题
2013/11/10 面试题
自荐书4要点
2014/01/25 职场文书
质检部经理岗位职责
2014/02/19 职场文书
高中军训感言400字
2014/02/24 职场文书
房屋出售协议书
2014/04/10 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
JavaScript组合继承详解
2021/11/07 Javascript