Pytorch 叶子张量 leaf tensor (叶子节点) (detach)

article/2025/8/26 20:57:40

      在Pytorch中,默认情况下,非叶节点的梯度值在反向传播过程中使用完后就会被清除,不会被保留。只有叶节点的梯度值能够被保留下来。

      对于任意一个张量来说,我们可以用 tensor.is_leaf 来判断它是否是叶子张量(leaf tensor)

      在Pytorch神经网络中,我们反向传播backward()就是为了求叶子节点的梯度。在pytorch中,神经网络层中的权值w的tensor均为叶子节点。它们的require_grad都是True,但它们都属于用户创建的,所以都是叶子节点。而反向传播backward()也就是为了求它们的梯度

       在调用backward()时,只有当requires_grad和is_leaf同时为真时,才会计算节点的梯度值

为什么需要叶子节点?

        那些非叶子节点,是通过用户所定义的叶子节点的一系列运算生成的,也就是这些非叶子节点都是中间变量,一般情况下,用户不回去使用这些中间变量的导数,所以为了节省内存,它们在用完之后就被释放了

在Pytorch的autograd机制中,当tensor的requires_grad值为True时,在backward()反向传播计算梯度时才会被计算。在所有的require_grad=True中,

  • 默认情况下,非叶子节点的梯度值在反向传播过程中使用完后就会被清除,不会被保留(即调用loss.backward() 会将计算图的隐藏变量梯度清除)。
  • 默认情况下,只有叶子节点的梯度值能够被保留下来。
  • 被保留下来的叶子节点的梯度值会存入tensor的grad属性中,在 optimizer.step()过程中会更新叶子节点的data属性值,从而实现参数的更新。

这样可以节省很大部分的显存

上面的话,也就是说,并不是每个requires_grad()设为True的tensor都会在backward的时候得到相应的grad.它还必须为leaf。这就说明. is_leaf=True 成为了在 requires_grad()下判断是否需要保留 grad的前提条件

      只有是叶张量的tensor在反向传播时才会将本身的grad传入的backward的运算中.。如果想得到当前自己创建的,requires_grad为True的tensor在反向传播时的grad, 可以用retain_grad()这个属性(或者是hook机制)

detach()将节点剥离成叶子节点

      如果需要使得某一个节点成为叶子节点,只需使用detach()即可将它从创建它的计算图中分离开来。即detach()函数的作用就是把一个节点从计算图中剥离,使其成为叶子节点

什么样节点会是叶子节点

①所有requires_grad为False的张量,都约定俗成地归结为叶子张量           

         就像我们训练模型的input,它们都是require_grad=False,因为他们不需要计算梯度(我们训练网络训练的是网络模型的权重,而不需要训练输入)。它们是一个计算图都是起始点,如下图的a

②requires_grad为True的张量, 如果他们是由用户创建的,则它们是叶张量(leaf Tensor)

        例如各种网络层,nn.Linear(), nn.Conv2d()等, 他们是用户创建的,而且其网络参数也需要训练,所以requires_grad=True

这意味着它们不是运算的结果,因此gra_fn为None

b是因为b是被cast操作创建的(从cpu cast一个tensor到gpu)

要和这里区分开

这里是说,单纯从数值关系上b=a+1,b确实依赖a(b是由a经过某个操作创建的)。但是从pytorch的看来,一切是为了反向求导,a的requires_grad属性为False,其不要求获得梯度,那么a这个tensor在反向传播时其实是“无意义”的,可认为是游离在计算图之外的,故b仍然为叶子节点,如下图

就连一个简单的不涉及梯度的操作也会使叶节点变成非叶节点

import torchx = torch.tensor(2.0, requires_grad=True)
y = x ** 2
z = y + 1
z.backward()
print(x.grad)
print(y.grad)
print(x.is_leaf)
print(y.is_leaf)
print(x.grad_fn)
print(y.grad_fn)

从这里可以看出,只有叶子节点有梯度值grad,非叶节点为None

只有非叶节点有grad_fn,叶节点为None

这里是的不出z本身的梯度的,因为z是非叶节点

另一个例子,如图中绿色的点都是叶子节点

非叶节点的梯度在反传后会被释放

 

import torch
a = torch.Tensor([1,2]).requires_grad_() 
b = torch.Tensor([3,4]).requires_grad_() 
d = torch.Tensor([2]).requires_grad_() 
c = a + b 
e = c * d 
o = e.sum()     o.backward()
print(a.grad)
print(b.grad)
print(c.grad)
print(d.grad)
print(e.grad)
print(o.grad)

可以从程序的输出中看到,a,b,d作为叶子节点,经过反向传播后梯度值仍然保留,而其它非叶子节点的梯度已经被自动释放了,要想得到它们的梯度值,就需要使用hook了

获得非叶节点的梯度 retain_grad()

import torchx=torch.arange(10,dtype=torch.float32,requires_grad=True).reshape(10,1)
w=torch.arange(10,dtype=torch.float32,requires_grad=True).reshape(1,10)
y=w@x
x.retain_grad()
w.retain_grad()
y.backward()
print(x.is_leaf)
print(w.is_leaf)
print(x.grad)
print(w.grad)

 可以看到x和w都不是叶节点,但是用retain_grad()可以使它们获得梯度。

注意retain_grad()一定要写在y.backward()前面

或者可以用hook

​​​​​​Pytorch(十四) —— hook_hxxjxw的博客-CSDN博客


http://chatgpt.dhexx.cn/article/DKAvIMsx.shtml

相关文章

Pytorch学习笔记(一)——自动求导和叶子节点

一、什么是叶子节点 PyTorch中的张量tensor有一个属性是is_leaf,当is_leaf为True时,改tensor是叶子张量,也叫叶子节点。 二、叶子节点的作用 PyTorch有自动求导的功能, 当requires_gradTrue时,PyTorch会自动记录运算…

数据结构-树:根节点、子节点、叶子节点是什么?

前言:这个属于数据结构:树。 下面给个例子图解释(根节点、子节点、叶子节点)。 上图数字 1、3、7是叶子节点;(因为他们下面没有分叉出子节点,所以称为:叶子节点)【度为0】…

数据结构 - 树

树 (1)相关概念 兄弟节点:节点的父节点是同一个节点,所以它们之间互称为兄弟节点。 根节点:没有父节点的节点叫作根节点 叶子节点:没有子节点的节点叫作叶子节点或者叶节点。 节点的高度:节…

根节点、子节点、叶子节点是什么?

前言:这个属于数据结构:树。 下面给个例子图解释(根节点、子节点、叶子节点)。 上图数字 1、3、7是叶子节点;(因为他们下面没有分叉出子节点,所以称为:叶子节点)【度为0】…

弱网、2G、3G、4G测试

1.各项指标 教程指引:弱网测试教程 2.概念介绍 Bandwidth(带宽)、Utilistation(利用百分比)、Round-trip(往返延迟)、MTU(最大传输单元) 3G:300k-2Mbps左…

简单实用Chrome 日常开发功能详解,帮助你上班摸鱼

chrome是目前开发过程中一骑绝尘的浏览器,占有绝对领导地位。其强大的功能和生态圈,让很多开发者爱不释手。但很多的开发者使用chrome还是停留在F12打开控制台查看log、检查元素或者debug打断点阶段,其实chrome的强大的功能远远超过我们的想象…

小米路由器3G如何解决USB3.0 5G WiFi速度慢的问题

经常玩电脑,希望家里有个轻 nas,小米路由器是一个不错的选择,tbw买了一个小米路由器3G看重的是快速的速度(usb3.0 5G Wifi),及小米的可拓展性,使用usb3.0的usb接口,且使用5gb网速&am…

浏览器通过f12来限制网速

浏览器可以使用F12开发者工具来模拟网速的快慢。 打开需要测试的网站,点击F12,再点击选项里的network-no throttling,展示的有几种,offline,快3g,慢3g,或者自定义 点击add可以自定义网速&#…

移动网速测试软件,网速测试大师APP

网速测试大师APP是一款专业的手机网络测试应用,支持一键测速,精准快速,还能全方位分析网速,Wifi和移动网络全检测,30秒测速当前网络状况,做随时随地的测速专家。 该软件整个测速过程精准又快速,…

android 显示网速,随着掌握联网状态 Android手机如何显示实时网速

很多时候手机信号栏明明显示正在联网而且图标也显示正在下载上传中,但就是打不开网页。实际上,此时可能正处于4G→3G切换状态而出现了短暂的断网。那么,如何才能准确掌握手机当前的联网状态呢? 答案很简单,就是通过手机…

Fiddler工具的弱网模拟2G/3G/4G

日常测试工作中,C端用户会因信号和设备网络原因,出现一些恶劣网络的状态,然后出现奇奇怪怪的丢包、重传、UI空白、UI绘制异常等问题,就需要测试人员去模拟这类弱网环境去重现用户反馈的问题,以方便开发同学解决和调优加…

网速测试大师的软件怎么回事,网速测试大师

手机网速测试大师是一款手机网络测试软件,通过手机网速测试大师你可以直接测试你手机的网络速度,无论是WIFI还是手机移动网络都可以检测,让你更加了解你的手机网络。 软件介绍 网速测试大师是一款热度仅次于Ookla Speedtest. net的网速测试工…

限制浏览器网速

需求:限制浏览器网速,拉长请求时间,方便验证请求loading状态是否添加成功。 ps:一般建议给弹窗/按钮增加loading状态,防止重复点击之后多次请求 解决方案:控制台(f12)-网络(Network) No throttling 无限制…

使用chrome进行慢网速测试

前言 在开发的时候,有这么一种情况,点击一个按钮调用一个接口生成数据,之后刷新页面,但是由于网络慢的原因,能够多次点击,但是自己的网络模拟不了很慢的情况,怎么办呢? 使用chrome…

Vue Chrome浏览器手动调节模拟网速

Chrome浏览器手动调节网速 1.首先打开chrome浏览器,按下键盘上的f12键,弹出开发者调试工具 2.点击network——>No throtting弹出选择项 3.选择需要模拟的选项就行了 Fast 3G:表示快的3g网速 Slow 3G:表示慢的3g网速 Offline…

3g显卡测试软件,3G网速测试细则

3G网速测试细则 3G网速测试细则 测试机型:小米手机2、小米手机2电信版、vivo X1st 测试机型 测试软件:speedtest 爱奇艺高清影视 测试软件 测试方法: ① 在同一时间段、同一地点使用Speedtest测试三台手机3G网络条件下的速度 ② 分别使用装有…

国内三大制式3G网络简介及比较

比比谁最快 随着中国电信近期3G网络试商用的开始,越来越多的用户开始关注国内3G网络上网速度,“传说”中的3G网络速度到底有多快呢?据最新的数据显示,中国电信的试商用测试信号可以达到近200KB/s的下载速度。这是怎样的一个概念&a…

python自动化介绍

首先我们得了解一下什么是自动化测试? Python自动化就是使用python语言来编写的脚本或者平台(自动化运维平台、自动化测试平台-->devops),实现公司中重复业务的自动化流程。大体的方向分为 python自动化测试 python自动化运维 …

【Python自动化测试32】App自动化环境搭建

文章目录 一、前言二、安装与环境搭建教学2.1 环境依赖2.2 appium程序安装2.3 appium-python-client2.4 模拟器安装2.5 java jdk安装2.6 Android SDK环境 一、前言 本文章主要讲解App自动化测试的环境搭建,在App自动化测试环境搭建中,有非常多的坑&#…