对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字符编码
Nov 12 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
python将一组数分成每3个一组的实例
Nov 14 Python
PyCharm设置每行最大长度限制的方法
Jan 16 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python对接支付宝支付自实现功能
Oct 10 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
对python中return与yield的区别详解
Mar 12 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
基于Python爬取fofa网页端数据过程解析
Jul 13 Python
Python中实现一行拆多行和多行并一行的示例代码
Sep 06 Python
Python中logging日志的四个等级和使用
Nov 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
做个自己站内搜索引擎
2006/10/09 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
简单js代码实现selece二级联动(推荐)
2014/02/18 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
浅谈对Angular中的生命周期钩子的理解
2017/07/31 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
在Python中使用第三方模块的教程
2015/04/27 Python
Python获取某一天是星期几的方法示例
2017/01/17 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
python实现xlsx文件分析详解
2018/01/02 Python
Pandas统计重复的列里面的值方法
2019/01/30 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
html5指南-4.使用Geolocation实现定位功能
2013/01/07 HTML / CSS
eBay意大利购物网站:eBay.it
2019/09/04 全球购物
什么是Rollback Segment
2013/04/22 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
社区结对共建协议书
2016/03/23 职场文书
2016年教育局“我们的节日——端午节”主题活动总结
2016/04/01 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
css弧边选项卡的项目实践
2023/05/07 HTML / CSS