浅谈对pytroch中torch.autograd.backward的思考


Posted in Python onDecember 27, 2019

反向传递法则是深度学习中最为重要的一部分,torch中的backward可以对计算图中的梯度进行计算和累积

这里通过一段程序来演示基本的backward操作以及需要注意的地方

>>> import torch
>>> from torch.autograd import Variable

>>> x = Variable(torch.ones(2,2), requires_grad=True)
>>> y = x + 2
>>> y.grad_fn
Out[6]: <torch.autograd.function.AddConstantBackward at 0x229e7068138>
>>> y.grad

>>> z = y*y*3
>>> z.grad_fn
Out[9]: <torch.autograd.function.MulConstantBackward at 0x229e86cc5e8>
>>> z
Out[10]: 
Variable containing:
 27 27
 27 27
[torch.FloatTensor of size 2x2]
>>> out = z.mean()
>>> out.grad_fn
Out[12]: <torch.autograd.function.MeanBackward at 0x229e86cc408>
>>> out.backward()   # 这里因为out为scalar标量,所以参数不需要填写
>>> x.grad
Out[19]: 
Variable containing:
 4.5000 4.5000
 4.5000 4.5000
[torch.FloatTensor of size 2x2]
>>> out  # out为标量
Out[20]: 
Variable containing:
 27
[torch.FloatTensor of size 1]

>>> x = Variable(torch.Tensor([2,2,2]), requires_grad=True)
>>> y = x*2
>>> y
Out[52]: 
Variable containing:
 4
 4
 4
[torch.FloatTensor of size 3]
>>> y.backward() # 因为y输出为非标量,求向量间元素的梯度需要对所求的元素进行标注,用相同长度的序列进行标注
Traceback (most recent call last):
 File "C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
  exec(code_obj, self.user_global_ns, self.user_ns)
 File "<ipython-input-53-95acac9c3254>", line 1, in <module>
  y.backward()
 File "C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\variable.py", line 156, in backward
  torch.autograd.backward(self, gradient, retain_graph, create_graph, retain_variables)
 File "C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\__init__.py", line 86, in backward
  grad_variables, create_graph = _make_grads(variables, grad_variables, create_graph)
 File "C:\Users\dell\Anaconda3\envs\my-pytorch\lib\site-packages\torch\autograd\__init__.py", line 34, in _make_grads
  raise RuntimeError("grad can be implicitly created only for scalar outputs")
RuntimeError: grad can be implicitly created only for scalar outputs

>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad        #注意这里的0.1,1.10为梯度求值比例
Out[55]: 
Variable containing:
 0.2000
 2.0000
 20.0000
[torch.FloatTensor of size 3]

>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad        # 梯度累积
Out[57]: 
Variable containing:
 0.4000
 4.0000
 40.0000
[torch.FloatTensor of size 3]

>>> x.grad.data.zero_() # 梯度累积进行清零
Out[60]: 
 0
 0
 0
[torch.FloatTensor of size 3]
>>> x.grad       # 累积为空
Out[61]: 
Variable containing:
 0
 0
 0
[torch.FloatTensor of size 3]
>>> y.backward(torch.FloatTensor([0.1, 1, 10]))
>>> x.grad
Out[63]: 
Variable containing:
 0.2000
 2.0000
 20.0000
[torch.FloatTensor of size 3]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查看多台服务器进程的脚本分享
Jun 11 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python科学画图代码分享
Nov 29 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
Dec 27 Python
python 表格打印代码实例解析
Oct 12 Python
详解django中Template语言
Feb 22 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
May 19 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
方法汇总:Python 安装第三方库常用
Apr 26 Python
python实现异常信息堆栈输出到日志文件
Dec 26 #Python
Python的对象传递与Copy函数使用详解
Dec 26 #Python
Python pandas库中的isnull()详解
Dec 26 #Python
python dataframe NaN处理方式
Dec 26 #Python
python实现大战外星人小游戏实例代码
Dec 26 #Python
Python数据存储之 h5py详解
Dec 26 #Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 #Python
You might like
比较详细PHP生成静态页面教程
2012/01/10 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
2015/12/19 PHP
php进程间通讯实例分析
2016/07/11 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
100多个基础常用JS函数和语法集合大全
2017/02/16 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
jQuery实现图片随机切换、抽奖功能(实例代码)
2019/10/23 jQuery
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Python的组合模式与责任链模式编程示例
2016/02/02 Python
Python编程实现的图片识别功能示例
2017/08/03 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
pytorch 数据集图片显示方法
2018/07/26 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
写自荐信三大法宝
2014/01/24 职场文书
大学生职业生涯规划书
2014/03/14 职场文书
《菜园里》教学反思
2014/04/17 职场文书
经管应届生求职信范文
2014/05/18 职场文书
2014年团工作总结
2014/11/27 职场文书
2015年教师节慰问信
2015/03/23 职场文书
用人单位聘用意向书
2015/05/11 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript