文章内容皆为个人理解,不足之处敬请指正。

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的含义以及它们之间的关系相关推荐

  1. 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 ...

  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 ...

  3. 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 ...

  4. 报错 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 % ...

  5. 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: ...

  6. 【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系

    学习交流加(可免费帮忙下载CSDN资源): 个人微信: liu1126137994 学习交流资源分享qq群1(已满): 962535112 学习交流资源分享qq群2: 780902027 文章目录 1 ...

  7. A leaf Variable that requires grad is being used in an in-place operation

    错误原因: 计算图中的叶子节点不能直接进行内置运算,防止影响计算图的反向传播运算.如果非要改变叶子节点data的值,可以直接对data属性调用内置运算,这样不会记录在计算图当中. 解决方案: 1.把梯 ...

  8. a view of a leaf Variable that requires grad is being used in an in-place operation.

    问题背景: 可以尝试的办法: 将pytorch1.8 降低到 1.7

  9. 清楚易懂的讲解”UV和PV“的含义,以及之间的区别。

    本文背景:在开始学习数据分析时,看到老师有提到UV和PV,,这已经不是第一次见到这两个词了,虽然也能大概描述是个什么意思,但是为了更清楚的讲出来UV.PV的含义(扩展:还有IP和VV的含义),特地写下 ...

最新文章

  1. 《C程序设计语言》(第二版)要点总结
  2. postman 发送到onenet,chinanet
  3. RS232与串口通信的4个注意事项详解
  4. LNMP里常见的502问题
  5. php文件管理 打包,Thinkphp6如何利用ZipArchive打包下载文件
  6. iOS9系列专题三——应用瘦身
  7. 《Look at Boundary: A Boundary-Aware Face Alignment Algorithm》代码调试
  8. python进阶06并发之二技术点关键词
  9. 2018百度之星程序设计大赛 - 资格赛 P1006三原色图(MST,并查集)
  10. pandoc -crossref插件实现markdwon文档转word后公式编号自定义
  11. 常用的几种向量运算法则
  12. 康托尔点集matlab实数,为什么康托尔集内的数和实数个数一样多
  13. 中国移动湖南公司2022校园春季招聘正在进行中
  14. 拒绝低效的知识管理,从选择一款好的知识库工具开始
  15. k8s 安装 elasticsearch(ECK)
  16. matlab 祁彬彬,MATLAB 向量化编程基础精讲
  17. 美狐美颜SDK开源代码浅析
  18. 1789 员工的直属部门
  19. 五线谱音名和组别对照表_认识五线谱,大谱表与钢琴对照表
  20. input 在ios环境下,input选中出现灰色背景

热门文章

  1. 海水淡化三十年打磨一把反渗透膜“利剑”
  2. LR(1)分析法的总控的实现(C++实现)
  3. 浅谈面试中常提到的乐观锁与悲观锁
  4. 第21课 机灵的小老鼠
  5. node_modules 困境
  6. 使用python Mayavi 绘制矢量场图
  7. 发现一个免费虚拟主机和云服务器的网站
  8. 高考计算机会考等级划分标准,学考等级怎么划分2020最新标准
  9. putty连接不上该怎么办
  10. 数据库管理系统MFC实现