解决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 strip lstrip rstrip使用方法
Sep 06 Python
Python输出9*9乘法表的方法
May 25 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
python实现一组典型数据格式转换
Dec 15 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
Python如何省略括号方法详解
Mar 21 Python
python wsgiref源码解析
Feb 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
php压缩多个CSS为一个css的代码并缓存
2011/04/21 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
javascript全局变量封装模块实现代码
2012/11/28 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
2014/02/23 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
微信小程序block的使用教程
2018/04/01 Javascript
常用的 JS 排序算法 整理版
2018/04/05 Javascript
JS正则表达式常见用法实例详解
2018/06/19 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
JavaScript实现alert弹框效果
2020/11/19 Javascript
python字典排序实例详解
2015/05/20 Python
python 表格打印代码实例解析
2019/10/12 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
会计自荐书
2013/12/02 职场文书
优秀毕业生自荐信范文
2014/01/01 职场文书
物业保安员岗位职责制度
2014/01/30 职场文书
应届毕业生自荐信
2014/05/28 职场文书
团拜会策划方案
2014/06/07 职场文书
党员个人整改措施
2014/10/24 职场文书
乡镇群众路线专项整治方案
2014/11/03 职场文书
大学生实训报告总结
2014/11/05 职场文书
八达岭长城导游词
2015/01/30 职场文书
团组织推荐意见
2015/06/05 职场文书
导游词之蜀山胜景瓦屋山
2019/11/29 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js