浅谈对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的Django框架中用流响应生成CSV文件的教程
May 02 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
python opencv实现图像边缘检测
Apr 29 Python
Python for i in range ()用法详解
Sep 18 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
Python基于字典实现switch case函数调用
Jul 22 Python
python实现一个简单RPC框架的示例
Oct 28 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 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
5.PHP的其他功能
2006/10/09 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
jQuery焦点图切换特效插件封装实例
2013/08/18 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
简要了解jQuery移动web开发的响应式布局设计
2015/12/04 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
公众号SVG动画交互实战代码
2020/05/31 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
python time()的实例用法
2020/11/03 Python
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
售后服务经理岗位职责范本
2014/02/22 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
留学推荐信怎么写
2015/03/26 职场文书
甲午风云观后感
2015/06/02 职场文书
教师节大会主持词
2015/07/06 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
Redis IP地址的绑定的实现
2021/05/08 Redis
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server