leaf Variable、requires_grad、grad_fn的含义以及它们之间的关系
文章内容皆为个人理解,不足之处敬请指正。
1、requires_grad
requires_grad是pytorch中tensor的一个属性,如果requires_grad=True,在进行反向传播的时候会记录t该tensor梯度信息。为了下面方便举例,我将进行运算的tensor称为父tensor,运算后的tensor称为子tensor,比如:c=a+b,c就是子tensor,a、b都为父tensor。
import torch
a=torch.tensor([1.,2,3,4],requires_grad=True)
b=torch.tensor([1.,2,3,4],requires_grad=False) #默认False
c=torch.sum(a*2)
c.backward()
print(a.grad)d=torch.sum(b+a)
d.backward()
print(b.grad)
print(b.requires_grad)
'''结果
tensor([2., 2., 2., 2.])
None
True #只要父tensor里有requires_grad=True的,子tensor的requires_grad=True
'''
可以看到requires_grad=True时进行反向传播会记录tensor的梯度信息,很方便我们使用梯度下降法。
2、grad_fn
grad_fn也是tensor的一个属性,它记录的是tensor的运算信息,比如c=a+b,那么c.grad_fn=<AddBackward0>,记录grad_fn信息的意义有利于我们使用反向传播算法,由子tensor计算父tensor的梯度。
import torch
a=torch.tensor([1.,2,3,4],requires_grad=True)
b=torch.tensor([1.,2,3,4],requires_grad=False) #默认false
c=a+b
print(a.grad_fn,b.grad_fn)
print(c.grad_fn)
print(c)
'''结果
None None
<AddBackward0 object at 0x000002293EBCE7B8>
tensor([2., 4., 6., 8.], grad_fn=<AddBackward0>)
'''
a、b是直接创建的、没有经过运算的tensor,其grad_fn=None,还有一个值得注意的地方,如果父tensor的requires_grad都为False,子tensor的grad_fn=None。因为你都不准备记录父tensor的梯度信息了,那么再记录子tensor的grad_fn信息也没什么必要了。
import torch
a=torch.tensor([1.,2,3,4],requires_grad=False)
b=torch.tensor([1.,2,3,4],requires_grad=False) #默认false
c=a+b
print(c.grad_fn)
print(c)
'''结果
None
tensor([2., 4., 6., 8.])
'''
3、leaf Variable
在写leaf Variable之前,我想先写一下Variable,可以帮助理清leaf Variable、requires_grad、grad_fn之间的关系。我们都知道,用pytorch搭建神经网络,数据都是tensor类型的,在先前的一些pytorch版本中(到底哪些我也不清楚,当前v1.3.1),tensor似乎只包含data信息,不会记录requires_grad、grad_fn信息,转化成variable之后才会有requires_grad和grad_fn属性。现在Variable基本可以被直接用tensor替代了,虽然现在还保留着Variable方法,我觉得用不到了,直接用tensor就可以了。
#Variable的使用
from torch.autograd import Variable
a=Variable(tensor,requires_gard=bool值)
leaf variable,你直接理解为手动创建的tensor也无妨,运算得到的tensor都不是leaf variable,可以用 .is_leaf查看tensor是否为leaf variable。
import torch
a=torch.tensor([1.,2,3,4],requires_grad=True)
b=torch.tensor([1.,2,3,4],requires_grad=False) #默认false
c=a+b
print(a.is_leaf)
print(c.is_leaf)
'''结果
True
False
'''
如果只这么理解,我觉得也足够了。
但其实还有一类经过运算得到的tensor也可以为leaf variable,那就是父tensor的requires_grad全为False的子tensor,
import torch
a=torch.tensor([1.,2,3,4],requires_grad=False)
b=torch.tensor([1.,2,3,4],requires_grad=False) #默认false
c=a+b
print(c.is_leaf)
print(c.grad_fn)
'''结果
True
None
'''
所以,更准确的来说,应该是grad_fn为None的tensor都是leaf variable,反之皆不是。我们可以例子中的c=a+b看作是一种直接创建tensor的方法,因为父tensor a和b除了进行c=a+b运算创建c之外,以后的反向传播算法以及我们关心的梯度,跟他俩都没关系(这儿可以把a、b、c当成神经网络底层的一部分),所以,从c才可能开始与梯度打交道。
leaf Variable、requires_grad、grad_fn的含义以及它们之间的关系相关推荐
- a leaf Variable that requires grad has been used in an in-place operation
a leaf Variable that requires grad has been used in an in-place operation 这个是因为写成了x+=2, 改为y = x + 2 ...
- RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.
跑yolov5的代码时,pytorch遇到<>RuntimeError: a view of a leaf Variable that requires grad is being use ...
- RuntimeError: a leaf Variable that requires grad has been used in an in-place operation
Traceback (most recent call last): File "E:\迅雷下载\向量\000.代码+数据+课件\YOLO5\yolov5-master\train.py&q ...
- 报错 RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation
报错大致意思是不能对在计算图中带梯度的变量进行操作 源代码 def anim(i):# update SMBLDcur_beta_idx, cur_step = i // num_steps, i % ...
- RuntimeError:a leaf Variable that requires grad has been used in an in-place
原文链接:https://blog.csdn.net/weixin_43056332/article/details/115188116 记录一下训练yolov5碰到的问题 RuntimeError: ...
- 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系
学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...
- A leaf Variable that requires grad is being used in an in-place operation
错误原因: 计算图中的叶子节点不能直接进行内置运算,防止影响计算图的反向传播运算.如果非要改变叶子节点data的值,可以直接对data属性调用内置运算,这样不会记录在计算图当中. 解决方案: 1.把梯 ...
- a view of a leaf Variable that requires grad is being used in an in-place operation.
问题背景: 可以尝试的办法: 将pytorch1.8 降低到 1.7
- 清楚易懂的讲解”UV和PV“的含义,以及之间的区别。
本文背景:在开始学习数据分析时,看到老师有提到UV和PV,,这已经不是第一次见到这两个词了,虽然也能大概描述是个什么意思,但是为了更清楚的讲出来UV.PV的含义(扩展:还有IP和VV的含义),特地写下 ...
最新文章
- 《C程序设计语言》(第二版)要点总结
- postman 发送到onenet,chinanet
- RS232与串口通信的4个注意事项详解
- LNMP里常见的502问题
- php文件管理 打包,Thinkphp6如何利用ZipArchive打包下载文件
- iOS9系列专题三——应用瘦身
- 《Look at Boundary: A Boundary-Aware Face Alignment Algorithm》代码调试
- python进阶06并发之二技术点关键词
- 2018百度之星程序设计大赛 - 资格赛 P1006三原色图(MST,并查集)
- pandoc -crossref插件实现markdwon文档转word后公式编号自定义
- 常用的几种向量运算法则
- 康托尔点集matlab实数,为什么康托尔集内的数和实数个数一样多
- 中国移动湖南公司2022校园春季招聘正在进行中
- 拒绝低效的知识管理,从选择一款好的知识库工具开始
- k8s 安装 elasticsearch(ECK)
- matlab 祁彬彬,MATLAB 向量化编程基础精讲
- 美狐美颜SDK开源代码浅析
- 1789 员工的直属部门
- 五线谱音名和组别对照表_认识五线谱,大谱表与钢琴对照表
- input 在ios环境下,input选中出现灰色背景