对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入门教程
Feb 08 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
Python模拟随机游走图形效果示例
Feb 06 Python
python查询mysql,返回json的实例
Mar 26 Python
PyQt实现界面翻转切换效果
Apr 20 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
使用Python爬虫库requests发送表单数据和JSON数据
Jan 25 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
django rest framework 过滤时间操作
Jul 12 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
Python+pyaudio实现音频控制示例详解
Jul 23 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 文件扩展名 获取函数
2009/06/03 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP图片处理之图片旋转和图片翻转实例
2014/11/19 PHP
php生成图片验证码-附五种验证码
2015/08/19 PHP
laravel请求参数校验方法
2019/10/10 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
js创建数组的简单方法
2016/07/27 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
分享5个顶级的JavaScript Ajax组件库
2018/09/16 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
python去掉行尾的换行符方法
2017/01/04 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
AmazeUI 模态窗口的实现代码
2020/08/18 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
综合素质自我评价怎么写
2014/09/14 职场文书
工作年限证明模板
2015/06/15 职场文书
整脏治乱工作简报
2015/07/21 职场文书
2015中学教学工作总结
2015/07/22 职场文书