backward的 retain_variables=True与retain_graph=True 区别及应用

自动微分原理与实战:从计算图到梯度调试的全链路解析 自动微分(AD)是现代可微编程的底层基石,它既非数值近似,也非符号推导,而是一种将程序编译为梯度计算流程的编译器级技术。其核心在于构建并执行计算图,通过反向模式链式法则实现高维参数空间下高效、精确的梯度生成。这一机制支撑了PyTorch、JAX和TensorFlow等框架的训练能力,也决定了梯度精度、内存占用与分布式扩展性。理解AD的张量属性(如requires_grad、grad_fn)、反向传播调度逻辑及计算图生命周期,是定位梯度消失、NaN、形状错配等‘幽灵bug’的关键。本文聚焦工程落地视角,结合P 阅读详情

首先 :retain_variables=True 与 retain_graph=True   没有任何区别 

        只是 retain_variables 会在pytorch 新版本中被取消掉,将使用 retain_graph 。

        所以 在使用 retain_variables=True 时报错:

        TypeError: backward() got an unexpected keyword argument 'retain_variables'

 

应用:

两者都是backward()的参数   默认 retain_graph=False,

也就是反向传播之后这个计算图的内存会被释放,这样就没办法进行第二次反向传播了,

所以我们需要设置为 retain_graph=True,

loss_1.backward(retain_graph=True) 

 

retain_graph:

每次 backward() 时,默认会把整个计算图free掉。一般情况下是每次迭代,只需一次 forward() 和一次 backward() ,前向运算forward() 和反向传播backward()是成对存在的,一般一次backward()也是够用的。但是不排除,由于自定义loss等的复杂性,需要一次forward(),多个不同loss的backward()来累积同一个网络的grad,来更新参数。于是,若在当前backward()后,不执行forward() 而可以执行另一个backward(),需要在当前backward()时,指定保留计算图,即backward(retain_graph)。

 

 

参考链接:https://www.pytorchtutorial.com/pytorch-backward/     不过这篇写的是旧版本的了!

PyTorch Tensor底层解密:内存布局、梯度机制与性能优化 Tensor是PyTorch的核心数据载体,远不止多维数组——它是具备设备感知、自动微分和内存共享能力的可执行计算单元。其本质由Storage(连续内存块)、TensorImpl(元数据+状态)和DataPtr(智能指针)三者协同构成,stride机制决定视图操作是否零拷贝,requires_grad属性则定义计算图中的梯度责任链。理解这些原理,能规避RuntimeError: Trying to backward through the graph a second time等高频报错,显著提升模型训练稳 阅读详情

相关推荐

PyTorch与TensorFlow底层机制对比:张量调度、图执行与跨框架调试

深度学习框架中的张量并非简单数组,而是承载计算历史与设备状态的运行时对象;PyTorch采用动态定义即运行的张量调度机制,依赖`.grad`与CUDA流显式管理梯度生命周期与内存同步,而TensorFlow 2.x则通过`@tf.function`将Python逻辑编译为延迟执行的符号计算图,其`tf.Variable`与`FuncGraph`共同构成状态化执行单元。这种底层哲学差异直接决定调试方式、性能瓶颈与部署路径——例如`RuntimeError: Expected all tensors to be

tomfish 355

pytorch 中retain_graph==True的作用

总的来说进行一次backward之后,各个节点的值会清除,这样进行第二次backward会报错,如果加上retain_graph==True后,可以再来一次backward。 retain_graph参数的作用 官方定义: retain_graph (bool, optional) – If False, the graph used to compute the grad will ...

qq_39861441的博客 3万+

pytorch retain_graph=True 训练导致GPU显存泄漏 OOM (out of memory)

训练过程中多个loss回传产生了GPU显存不够用的情况(即使是设置batch_size最小也不行),在backward函数中去掉retain_graph=True之后,情况没有出现。 我这里出现这个情况的原因:因为不同loss求完之后没有算均值,可能返回的是一个tensor,要通过 .mean() 把它变成标量。 解决: criterion = torch.nn.CrossEntropyLoss() output = module_a(fc1Features,label) arcLoss = criteri

Hello Word! 3101

pytorch的计算图 loss.backward(retain_graph=True) # 添加retain_graph=True标识,让计算图不被立即释放

前言:接触pytorch这几个月来,一开始就对计算图的奥妙模糊不清,不知道其内部如何传播。这几天有点时间,就去翻阅了Github,pytorch Forum,还有很多个人博客(后面会给出链接),再加上自己的原本一些见解,现在对它的计算图有了更深层次的理解。pytorch是非常好用和容易上手的深度学习框架,因为它所构建的是动态图,极大的方便了coding and debug。可是对于初学者而言,计算...

Arthur_Holmes的博客 9941

Pytorch 中retain_graph的用法详解

用法分析 在查看SRGAN源码时有如下损失函数,其中设置了retain_graph=True,其作用是什么? ############################ # (1) Update D network: maximize D(x)-1-D(G(z)) ########################### real_img = Variable(target) if torch.cuda.is_available(): real_img = real_img.cuda() z = Variable(data) if

23.501中英对照(46):5QI到Qos特征的映射

注4:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为1毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注5:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为2毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注6:对于UPF终止N6与5G-AN之间的延迟,CN PDB的静态值为5毫秒,应从给定的PDB中减去该值以得出适用于无线接口的分组延迟预算。注:建议为任何新的非GBR资源类型的标准化5QI分配小于64的值。

51学通信的博客 1294

【Pytorch】backward的 retain_variables=True与retain_graph=True 区别及应用

首先 :retain_variables=True 与 retain_graph=True没有任何区别 只是 retain_variables 会在pytorch 新版本中被取消掉,将使用 retain_graph 。 所以 在使用 retain_variables=True 时报错: TypeError: backward() got...

mjiansun的专栏 1556

cst-python联合仿真的问题解决

cst与python联合仿真出现无法调用CST的问题解决

ayihu_的博客 2370

数据的backward

backward: 旧版本: retain_variables=True 新版本: retain_graph=True 区别及应用

nbxuwentao的博客 345

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

android HTTPS未校验服务器证书漏洞修复

上述代码是重写了域名校验的逻辑,每个证书里携带的域名是不可更改的,如果证书是合法的证书签发机构签发的,并且域名是和你要请求的域名对的上的,基本上就能确认你访问就服务器地址就是要访问的服务器地址,这样才是安全的。上述代码就是重新了证书校验的逻辑,信任所有的证书,正确的逻辑是要校验证书是否是可信任的证书签发机构所认证的,如果不校验的话你虽然是用了https加密传输,只要你的客户端用户信任了其他的证书哪怕是非法的证书,一样能够请求通过,而这个证书的服务器就可以解密你的报文,拿到你的隐私信息了。

kyzycyey的专栏 2622

PyTorch中的Variable变量详解

PyTorch中的Variable变量详解 一、了解Variable 顾名思义,Variable就是 变量 的意思。实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这正好就符合了反向传播,参数更新的属性。 具体来说,在pytorch中的Variable就是一个存放会变化值的地理位置,里面的值会不停发生片花,就像一个装鸡蛋的篮子,鸡蛋数会不断发生变化。那谁是里面的鸡蛋...

Elvirangel的博客 1207

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 956

PyTorch C++部署中梯度计算优化:五大实战技巧提升性能与稳定性

在深度学习模型部署中,梯度计算是训练和微调的核心环节,其原理基于自动微分构建动态计算图以追踪张量操作。高效管理梯度计算对生产环境至关重要,直接影响内存占用、计算效率和系统稳定性。通过优化梯度计算,可以显著提升模型推理和在线学习的性能,尤其在C++部署场景下,需要精细控制计算图生命周期和内存管理。本文聚焦PyTorch C++前端(LibTorch)的梯度计算优化,针对内存泄漏和计算冗余等常见问题,结合**计算图生命周期**和**梯度缓存管理**等热词,提供从原理到实践的解决方案,涵盖推理与训练模式切换、算子

cuanji3287的博客 322

C#通过Aforge调用电脑摄像头(附代码)

C#标准库本身不带有能调用电脑摄像头的库,如果利用windows自身的API来实现的话,着实有些麻烦。Aforge这个第三方库能很好的实现调用、处理的功能。 PS:文末给大家分享了完整的项目源码,各位最好先下载下来,对照着来看 1、先看一下效果 2、Aforge介绍 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,这个框架提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。 3、我使用的开发环境 操作系统

weixin_44996090的博客 1万+

提示libfakeroot.so或libfakeroot-sysv.so出错处理方法

嵌入式Linux、Buildroot交叉编译出现fakeroot问题处理方法。

阿xin*的嵌入式AI 1443

手写自动微分引擎:从标量函数到PyTorch计算图的深度解析

自动微分(AD)是深度学习反向传播的底层基石,它并非数学符号推导,而是对程序执行过程的梯度追踪机制。其核心原理是将前向计算分解为原子操作(如加、乘、sin),为每个操作定义局部导数规则,并通过计算图拓扑排序实现梯度的反向累积。这一机制直接支撑了PyTorch的autograd系统,决定了梯度能否正确回传至权重——当出现requires_grad=False、in-place修改或图断裂时,backward失败本质是AD调度链的中断。在工程实践中,AD与内存优化(如梯度检查点)、精度控制(如混合精度训练)深度

weixin_34050005的博客 360

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5079

PyTorch CNN从零调试实战:张量形状、梯度追踪与训练稳定性

卷积神经网络(CNN)是计算机视觉的基石模型,其核心在于张量在各层间的精确流动与梯度的可控传播。理解`nn.Conv2d`的4D权重结构、`BatchNorm2d`的训练/推理模式差异、`CrossEntropyLoss`的隐式`log_softmax`机制,是避免`RuntimeError`和`nan loss`的前提。本文聚焦PyTorch框架下CNN的可复现训练实践,深入解析`requires_grad`控制、`torch.no_grad()`作用域、`zero_grad()`调用时机等关键工程细节,

aebe49167的博客 439

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

物理信息神经网络(PINN)入门:PyTorch与TensorFlow框架对比与实现

在科学计算与深度学习交叉领域,偏微分方程(PDE)的求解长期依赖传统数值方法。物理信息神经网络(PINN)通过将物理方程残差嵌入损失函数,融合自动微分技术,实现无需网格的PDE求解。该方法在数据稀疏的反问题与正向建模中展现出独特价值。本文以PyTorch与TensorFlow为对象,对比二者的自动微分机制,并结合一阶ODE算例演示PINN的完整实现流程,帮助读者快速上手。

weixin_34347651的博客 324

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ECC pytorch-build-resolver 智能体实战解析:PyTorch 运行时、CUDA 与训练错误的系统化排查方法

本篇指南以 [agents/pytorch-build-resolver.md](https://link.gitcode.com/i/a589bd632ae72dada351040d7843a5a2)(及其 [docs/es/agents/pytorch-build-resolver.md](https://link.gitcode.com/i/b8b023b74c153ed40b2e7911a

gitblog_00713的博客 927

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Pytorch中backward(retain_graph=True)的 retain_graph参数解释

每次 backward() 时,默认会把整个计算图free掉。一般情况下是每次迭代,只需一次 forward() 和一次backward() ,前向运算forward() 和反向传播backward()是成对存在的,一般一次backward()也是够用的。 但是不排除,由于自定义loss等的复杂性,需要一次forward(),多个不同loss的backward()来累积同一个网络的gra...

今晚打老虎 1万+

【Pytorch进阶】pytorch中loss.backward() retain_graph=True参数意义

在定义loss时上面的代码是标准的三部曲,但是有时会碰到loss.backward(retain_graph=True)这样的用法。这个用法的目的主要是保存上一次计算的梯度不被释放。具体的计算图细节问题可以见参考文献[1]。

星之所望的博客 3662

Pytorch中retain_graph参数的作用

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time. 前言 在pytorch神经网络迁移的官方教程中有这样一个损失层函数(具体看这里提供0.3.0版中文链接:https://oldpan.me/archives/pyto

weixin_36670529的博客 3173

【已解决】backward() got an unexpected keyword argument 'retain_variables'

出现这个报错的原因是,在新版本的Python下,原来的变量retain_variables被替换成了retain_graph。因此,在调用位置将其替换就可以了。 注:retain_graph的作用是为了避免内存在反向传播之后被释放,从而导致的无法第二次反向传播。因此需要将backward(retain_graph=True)。 ...

ShuqiaoS的博客 6206
上一篇: 训练中动态调整学习率lr,optimizer.param_groups
下一篇: 图像小知识点总结-1
color丶瞎
博客等级 码龄9年 13粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值