Pytorch backward报错2次访问计算图需要 retain_graph=True 的一种情况

《从深度学习基础到车道线模型训练与部署》学习(三) 1.Python常用库之一:Numpy库 NumPy是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。总而言之,包含: 一个强大的N维数组对象 ndarray 广播功能函数 整合 C/C++/Fortran 代码的工具 线性代数、傅里叶变换、随机数生成等功能 2.Python常用库之二:Pandas库 Pandas是用于数据操纵和分析,建立在Numpy之上的。Pandas为Python带来了两种新的数据结构:Pandas Series和 阅读详情

错误代码

错误的原因在于

y1 = 0.5*x*2-1.2*x
y2 = x**3

没有放到循环里面,没有随着 x 的优化而相应变化。

import torch
import numpy as np
import torch.optim as optim

torch.autograd.set_detect_anomaly(True)

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device)


y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32,  device=device)

print(f'x{x}')


optimizer = optim.Adam([x], lr=1)
y1 = 0.5*x*2-1.2*x
y2 = x**3

for i in range(10):

    print(f'{i}: x{x}')
    optimizer.zero_grad()


    loss = (y1+y2-y_GT).mean()
    loss.backward()
    optimizer.step()
    print(f'{i}: x{x}')

正确代码

import torch
import numpy as np
import torch.optim as optim

torch.autograd.set_detect_anomaly(True)

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
x = torch.tensor([1.0, 2.0, 3.0,4.5], dtype=torch.float32, requires_grad=True, device=device)


y_GT= torch.tensor([10, -20, -30,45], dtype=torch.float32,  device=device)

print(f'x{x}')


optimizer = optim.Adam([x], lr=1)


for i in range(10):

    print(f'{i}: x{x}')
    optimizer.zero_grad()
    y1 = 0.5*x*2-1.2*x
    y2 = x**3

    loss = (y1+y2-y_GT).mean()
    loss.backward()
    optimizer.step()
    print(f'{i}: x{x}')

【PyTorch】retain_graph的作用 x = torch.randn((1, 4), dtype=torch.float32, requires_grad=True) x Out[54]: tensor([[ 0.1351, 0.8179, 0.1422, -0.3021]], requires_grad=True) y = x ** 2 z = y * 4 output1 = z.mean() output2 = z.sum... 阅读详情

相关推荐

PyTorch动态计算图生命周期管理:解决RuntimeError: Trying to backward through the graph a second time

在深度学习框架中,自动微分是实现神经网络训练的核心机制,它通过构建计算图来追踪张量间的运算依赖关系。PyTorch采用动态计算图,每次前向传播都会实时构建一个记录所有中间变量和运算的有向无环图。反向传播时,框架会沿着该图执行链式法则,计算参数的梯度。默认情况下,为高效利用内存,计算图在完成一次反向传播后会被立即销毁。这一机制在标准训练循环中表现优异,但在多任务学习、GAN训练等需要单次迭代内多次计算梯度的复杂场景下,若未妥善处理计算图生命周期,便会触发“RuntimeError: Trying to bac

weixin_33816946的博客 404

with torch.autograd.set_detect_anomaly(True)

在深度学习中,自动微分是计算导数的一种技术,它通过构建计算图并沿着计算图反向传播梯度,从而有效地计算一个函数相对于其输入变量的导数。这种技术使得训练神经网络成为可能,因为我们可以自动地获得关于网络权重的梯度信息,并使用优化算法进行参数更新。PyTorch的自动微分模块负责动态构建计算图并计算梯度。在大多数情况下,PyTorch的自动微分功能能够正常工作并产生正确的梯度。然而,当计算图非常复杂或存在其他问题时,可能会出现梯度计算错误,导致训练不稳定或结果不准确。

牛肉胡辣汤 6959

PyTorch计算图原理:从grad_fn到backward的动态图机制解析

计算图是深度学习框架自动微分的核心抽象,本质是描述张量间数值依赖关系的有向无环图(DAG)。其原理基于链式法则的拓扑反向遍历,通过每个非叶子张量的grad_fn属性实时构建节点,以next_functions维护上游边连接。这种动态图机制赋予PyTorch运行时建图、条件分支适配和灵活梯度控制的技术价值,广泛应用于模型调试、自定义算子开发、GAN训练及梯度监控等工程场景。理解grad_fn、retain_graph与backward执行链,是掌握PyTorch Autograd底层行为的关键起点。

weixin_34101784的博客 384

torch.autograd.detect_anomaly() 工具的使用(记录)

正向传播以及反向传播时添加异常侦测,减少找代码bug的时间。

ybacm的博客 1万+

单片机开发者的福音:3步搞定VSCode智能补全(IAR工程+Clangd实战)

本文为单片机开发者提供了一套高效解决方案,通过EIDE插件将IAR工程导入VSCode,并生成关键的compile_commands.json文件,结合Clangd配置,仅需三步即可实现精准的智能代码补全、一键跳转等现代编辑功能,大幅提升嵌入式开发效率。

coffee的博客 524

广告推荐算法 - 学习笔记(持续更新中)

本篇博客,是我用来记录学习广告推荐算法的一些笔记和总结。王喆:"深度"学习计算广告计算广告系统的核心目标是通过数据、算法和技术,在合适的场景下,将最相关的广告精准推送给目标用户,同时实现广告主媒体平台和用户之间的多方利益最大化。广告主:需求方核心目标:通过精准投放广告,最大化转化(如点击、购买)并控制成本,提升投资回报率(ROI)。关键行为:广告创建,定向设置,预算与出价策略,效果监控媒体平台:供给方核心目标:最大化广告收入,同时保持用户体验以避免用户流失。

qq_39748832的博客 2197

动手学深度学习笔记第四章(多层感知器)

深度学习知识

qq_46144849的博客 1373

别再搞混了!用示波器实测SVPWM:相电压、线电压、端电压波形到底长啥样?(附TI/ST官方笔记解读)

本文详细解析了SVPWM波形实测中的相电压、线电压和端电压的区别与测量技巧,结合TI/ST官方笔记,揭示了马鞍形波形的形成原理及常见误区。通过示波器实测案例,帮助电力电子工程师准确理解并应用这些关键概念,提升电机控制系统的调试效率。

weixin_30632883的博客 433

pytorch 梯度爆炸调试方法

调试模式下运行代码,并按以下代码设置torch配置, torch.autograd.set_detect_anomaly(True) with torch.autograd.detect_anomaly(): loss = loss_func() 发生梯度爆炸时,torch会显示存在梯度爆炸的代码,如

pp2373886592的博客 3134

ICC II 时钟树综合(CTS)前奏:从约束定义到NDR规则的全方位设置指南

本文详细介绍了ICC II中时钟树综合(CTS)的前期准备工作,包括约束定义、NDR规则设置和时钟平衡点控制等关键步骤。通过实际案例和代码示例,指导工程师如何优化时钟偏斜、插入延迟和信号质量,确保芯片设计的时序收敛和性能稳定。特别强调了非默认布线规则(NDR)在时钟网络设计中的重要性。

weixin_42530458的博客 212

零基础学习CANoe Panel(5)——改变变量的值,控件图像也改变,这是怎么回事?

Panel 中控件的图像随着值变化,是怎么回事?

蚂蚁小兵 2145

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万+

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9991

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

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

Arthur_Holmes的博客 9941

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1366

RK3588 开启多窗口

这样就支持多窗口了。

tzj1058756809的博客 268

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

目录1 定义loss backward2 例子3 参考文献 1 定义loss backward optimizer.zero_grad() loss.backward() optimizer.step() 在定义loss时上面的代码是标准的三部曲,但是有时会碰到loss.backward(retain_graph=True)这样的用法。 这个用法的目的主要是保存上一次计算的梯度不被释放。具体的计算图细节问题可以见参考文献[1]。 2 例子 retain_graph参数的作用见参考文献【2】 官方定义: r

sxl的博客 3392

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

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

RuntimeError: Trying to backward through the graph a second time but the buffers have already been f

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed 遇到过几次这个报错了,这几天把backward和autograd给看了几遍,终于摸着点门道 首先要知道,为什么会报这个错,这个错翻译成白话文就是说:当我们第二次backward的时候,计算图的结构已经被破坏了(释放了),这也是pytorch动态图的机制,可以节省内存。 这里不仔细讲解backw

SY_qqq的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

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

pytorch报错详解:RuntimeError: Trying to backward through the graph a second time

代码如下,当我尝试对y3进行第二次梯度计算时,报了这个错 import torch x = torch.tensor([1], dtype=torch.float32, requires_grad=True) y1 = x ** 2 y2 = x ** 3 y3 = y1 + y2 y3.backward() print(x.grad) x.grad.data.zero_() y3.backward() print(x.grad) 百度了一下问题原因和解决方法, 解决方法:在第一次backward中加一

qq_40349484的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Pytorch中有多次backward时需要retain_graph参数

Pytorch中有多次backward时需要retain_graph参数 背景介绍 Pytorch中的机制是每次调用loss.backward()时都会free掉计算图中所有缓存的buffers,当模型中可能有多次backward()时,因为前一次调用backward()时已经释放掉了buffer,所以下一次调用时会因为buffers不存在而报错 解决办法 loss.backward(retain_graph=True) 错误使用 optimizer.zero_grad() 清空过往梯度; loss1.b

m0_45388819的博客 2152

【解决】RuntimeError:Trying to backward throughthe graph a second time

RuntimeError:Trying to backward throughthe graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call.backward() or autograd.grad().

傲笑风的博客 1万+

pytorch autograd backward函数中 retain_graph参数的作用,简单例子分析,以及create_graph参数的作用...

retain_graph参数的作用 官方定义: retain_graph (bool, optional) – If False, the graph used to compute the grad will be freed. Note that in nearly all cases setting this option to True is not needed and often ...

weixin_30952103的博客 917

【深度学习工程师必看】:backward()中retain_graph、create_graph到底怎么用?

掌握PyTorch自动求导backward()参数用法,解决训练中梯度清零与高阶导数难题。详解retain_graph和create_graph在循环训练、梯度累积与二阶梯度计算中的应用技巧,提升模型稳定性与性能,值得收藏。

LogicNest的博客 1033

Pytorch 常见报错 RuntimeError: Trying to backward through the graph a second time

RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. model = RNN() hn = torch.zeros(1,seq_len,hidden_num) epochs = 250 clip_value = 100 loss = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.pa

weixin_44618906的博客 6228

(Pytorch)简单了解torch.autograd.grad()以及torch.autograd.backward()

这个时候,我们就可以用上grad_outputs,这个东西就会充当dz/dy的作用,那么我门只需要求解dy/dx即可,然后相乘,(dz/dy)*(dy/dx)=dz/dx,就得到了我们最终想要的。看起来平平无奇对不对,但是,计算谁对谁的梯度, 通过这个函数,你可以自由控制啦。然后,我们再说一下其中的参数grad_outputs,其他的比如retain_graph我们就不说了,这个东西我早在其他文章说过,属于必修内容。y和dzdy需要形状相同,这其实本来就一定要啊,对y的导数和y的数量当然是一样的。

qq_43391414的博客 1万+
上一篇: 将pytorch中变量的梯度为 nan 的替换成 1 还是 0?
下一篇: ubuntu 图形化界面卡死
培之
博客等级 码龄8年 7765粉丝 301原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

培之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值