解决torch.autograd.backward中的参数问题


Posted in Python onJanuary 07, 2020

torch.autograd.backward(variables, grad_variables=None, retain_graph=None, create_graph=False)

给定图的叶子节点variables, 计算图中变量的梯度和。 计算图可以通过链式法则求导。如果variables中的任何一个variable是 非标量(non-scalar)的,且requires_grad=True。那么此函数需要指定grad_variables,它的长度应该和variables的长度匹配,里面保存了相关variable的梯度(对于不需要gradient tensor的variable,None是可取的)。

此函数累积leaf variables计算的梯度。你可能需要在调用此函数之前将leaf variable的梯度置零。

参数:

variables(变量的序列) - 被求微分的叶子节点,即 ys 。

grad_variables((张量,变量)的序列或无) - 对应variable的梯度。仅当variable不是标量且需要求梯度的时候使用。

retain_graph(bool,可选) - 如果为False,则用于释放计算grad的图。请注意,在几乎所有情况下,没有必要将此选项设置为True,通常可以以更有效的方式解决。默认值为create_graph的值。

create_graph(bool,可选) - 如果为True,则将构造派生图,允许计算更高阶的派生产品。默认为False。

我这里举一个官方的例子

import torch
from torch.autograd import Variable
x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()#这里是默认情况,相当于out.backward(torch.Tensor([1.0]))
print(x.grad)

输出结果是

Variable containing:
 4.5000 4.5000
 4.5000 4.5000
[torch.FloatTensor of size 2x2]

解决torch.autograd.backward中的参数问题

接着我们继续

x = torch.randn(3)
x = Variable(x, requires_grad=True)

y = x * 2
while y.data.norm() < 1000:
  y = y * 2

gradients = torch.FloatTensor([0.1, 1.0, 0.0001])
y.backward(gradients)
print(x.grad)

输出结果是

Variable containing:
 204.8000
 2048.0000
  0.2048
[torch.FloatTensor of size 3]

这里这个gradients为什么要是[0.1, 1.0, 0.0001]?

如果输出的多个loss权重不同的话,例如有三个loss,一个是x loss,一个是y loss,一个是class loss。那么很明显的不可能所有loss对结果影响程度都一样,他们之间应该有一个比例。那么比例这里指的就是[0.1, 1.0, 0.0001],这个问题中的loss对应的就是上面说的y,那么这里的输出就很好理解了dy/dx=0.1*dy1/dx+1.0*dy2/dx+0.0001*dy3/dx。

如有问题,希望大家指正,谢谢_!

以上这篇解决torch.autograd.backward中的参数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python对字典进行排序实例
Sep 25 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python实现简易Web爬虫详解
Jan 03 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
python3.5安装python3-tk详解
Apr 26 Python
详解Python是如何实现issubclass的
Jul 24 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
用opencv给图片换背景色的示例代码
Jul 08 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
Pytorch 中retain_graph的用法详解
Jan 07 #Python
PyTorch中的Variable变量详解
Jan 07 #Python
python enumerate内置函数用法总结
Jan 07 #Python
pytorch加载自定义网络权重的实现
Jan 07 #Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 #Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 #Python
浅谈Python访问MySQL的正确姿势
Jan 07 #Python
You might like
PHP生成便于打印的网页
2006/10/09 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
php图像验证码生成代码
2017/06/08 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
js运算符的一些特殊用法
2018/07/29 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
学习python (1)
2006/10/31 Python
python实现挑选出来100以内的质数
2015/03/24 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
django rest framework之请求与响应(详解)
2017/11/06 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
python生成特定分布数的实例
2019/12/05 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
美国体育用品在线:Modell’s Sporting Goods
2018/06/07 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
请解释在new与override的区别
2012/10/29 面试题
企业后勤岗位职责
2014/02/28 职场文书
医学生就业推荐表自我鉴定
2014/03/26 职场文书
环保倡议书
2014/04/14 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书