对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使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
利用Python读取文件的四种不同方法比对
May 18 Python
正则给header的冒号两边参数添加单引号(Python请求用)
Aug 09 Python
Python文件操作方法详解
Feb 09 Python
使用Keras实现简单线性回归模型操作
Jun 12 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
Django数据模型中on_delete使用详解
Nov 30 Python
python的setattr函数实例用法
Dec 16 Python
python 制作网站筛选工具(附源码)
Jan 21 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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(5) 类和对象
2010/02/16 PHP
php读取大文件示例分享(文件操作类)
2014/04/13 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
JAVASCRIPT实现的WEB页面跳转以及页面间传值方法
2010/05/13 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python 网页解析HTMLParse的实例详解
2017/08/10 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
2018/07/11 Python
Keras设置以及获取权重的实现
2020/06/19 Python
在 Python 中使用 MQTT的方法
2020/08/18 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
社会调查研究计划书
2014/05/01 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
商标侵权律师函
2015/05/27 职场文书
幼儿园六一主持词开场白
2015/05/28 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
转变工作作风心得体会
2016/01/23 职场文书
Python 语言实现六大查找算法
2021/06/30 Python
深入理解go slice结构
2021/09/15 Golang