对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中的算数运算符的用法
May 13 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
Aug 05 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
django models里数据表插入数据id自增操作
Jul 15 Python
基于Python爬取股票数据过程详解
Oct 21 Python
python实现计算图形面积
Feb 22 Python
python re模块常见用法例举
Mar 01 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
php仿ZOL分页类代码
2008/10/02 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
bootstrap table实例详解
2017/01/06 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
在vue中封装的弹窗组件使用队列模式实现方法
2020/07/23 Javascript
Python中字符编码简介、方法及使用建议
2015/01/08 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Python实现在线批量美颜功能过程解析
2020/06/10 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
ASOS英国官网:英国在线时装和化妆品零售商
2017/05/19 全球购物
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
最新党员的自我评价分享
2013/11/04 职场文书
高中毕业自我鉴定
2013/12/19 职场文书
半年思想汇报
2013/12/30 职场文书
读书活动总结
2014/04/28 职场文书
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS