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

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

【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

【分子指纹】化学分子指纹的概念和应用(非常重要)

分子指纹(Molecular fingerprints)可以低计算成本的方式表示大规模化学数据集中化合物的化学(结构、物理化学等)性质。它们在将化学数据集中的分子转换为适合于计算方法的一致输入格式(bit向量或数值)方面发挥着重要作用。在这篇综述中,

DJJ5210的博客 1万+

数据的backward

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

nbxuwentao的博客 345

MATLAB Appdesigner开发独立桌面App全流程(一):以打开串口功能为例介绍Appdesigner的基本使用

本文详细介绍了Appdesigner的基本使用,以串口功能为例介绍按钮回调函数的实现以及控件之间通信的问题

Zhuwany的博客 3万+

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

PyTorch中的Variable变量详解

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

Elvirangel的博客 1207

Ubuntu环境下读取罗技G29方向盘信息

Ubuntu环境下读取罗技G29方向盘信息

工大机器人工作室 3456

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

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

cuanji3287的博客 322

【100%通过率】华为od机试C卷【出差 / 员工派遣】Java&Go 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2635

【数据集】GPM IMERG Daily Precipitation Dataset

GPM IMERG Daily Precipitation Dataset

WW、forever的博客 1218

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

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

weixin_34050005的博客 360

【Visual Assist X助手安装问题】Visual Assist X无法安装(双击安装包没反应) | Visual Assist X安装后在Visual Studio中找不到(亲测有效)

本文分享了Visual Assisant X助手的安装与使用问题的详细解决办法,因为网上搜集的信息比较少,所以有一定的参考价值。考虑到很多开发新手会遇到上述问题,可能对Windows系统不熟悉,所以相关操作步骤讲解的很详细!

dvlinker的技术专栏 6万+

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

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

aebe49167的博客 439

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

weixin_34347651的博客 324

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值