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

2024-03-06 20:38

本文主要是介绍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的时候,计算图的结构已经被破坏了(buffer的梯度被释放了),这也是pytorch动态图的机制,可以节省内存。

这里不仔细讲解backward是怎么工作的了,一般我们在训练的时候常用的就是loss.backward()这种写法,loss一般是一个标量

在pytorch的计算图中,其实只有两种元素:tensor和function,function就是加减乘除、开方、幂指对、三角函数等可求导运算,而tensor可细分为两类:叶子节点(leaf node)和非叶子节点。使用backward()函数反向传播计算tensor的梯度时,并不计算所有tensor的梯度,而是只计算满足这几个条件的tensor的梯度:1.类型为叶子节点、2.requires_grad=True、3.依赖该tensor的所有tensor的requires_grad=True。

看下面的这段代码

这样执行完以后就会报开头的错

根据这段代码画出计算图,x是叶子节点,y和z都不是叶子节点

当我们进行m.backward()之后,这个红框内的计算图就被破坏了,报错里说 the buffers have already been freed,在这张图上,很明显y不是叶子节点,不属于m.backward()里要计算的tensor,buffer指的就是y的梯度被释放掉了, m.backward()只会计算保留x的梯度

如果不想释放y的梯度怎么办,可以用m.backward(retain_graph=True)

buffer:反向传播中不需要被optimizer更新,区别于parameter

进行n.backward()中,y是参与在计算图内的,但y的梯度已经被free掉了,所以报错

再看下一个例子

这段代码是不会报错的

虽然他们的计算图有相交之处(共享了x),x是叶子节点且requires_grad=True,经过backward后它的梯度是保留的,重要的是buffer(y和z)是不共享的,所以不会相互干扰

 

最后再来说下detach的作用,detach可以把一个非叶子节点变成叶子节点且requires_grad=False

看下图,蓝色箭头代表backward时的流向

 

当我们把z 变成z.detach() ,流向就会变成这样

 

detach可以起到截流的作用

 

总结: 当报错RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed

1.看看是不是自己的loss.backward里用到的参数里有重复用过的buffer

2.如果想把这个buffer作为叶子节点(不考虑之前的梯度)参与计算图,可以用detach的方法

 

参考:https://zhuanlan.zhihu.com/p/85506092 

这篇关于RuntimeError: Trying to backward through the graph a second time but the buffers have already been f的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/781280

相关文章

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

图神经网络框架DGL实现Graph Attention Network (GAT)笔记

参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 ——基础操作&消息传递 [3]Cora数据集介绍+python读取 一、DGL实现GAT分类机器学习论文 程序摘自[1],该程序实现了利用图神经网络框架——DGL,实现图注意网络(GAT)。应用demo为对机器学习论文数据集——Cora,对论文所属类别进行分类。(下图摘自[3]) 1. 程序 Ubuntu:18.04

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

Tomcat启动报错:transport error 202: bind failed: Address already in use

Tomcat启动报错:transport error 202: bind failed: Address already in use 了,上网查找了下面这篇文章。也是一种解决办法。 下文来自:http://blog.csdn.net/sam031503/article/details/7037033 tomcat 启动日志报出以下错误:  ERROR: transport err

A Comprehensive Survey on Graph Neural Networks笔记

一、摘要-Abstract 1、传统的深度学习模型主要处理欧几里得数据(如图像、文本),而图神经网络的出现和发展是为了有效处理和学习非欧几里得域(即图结构数据)的信息。 2、将GNN划分为四类:recurrent GNNs(RecGNN), convolutional GNNs,(GCN), graph autoencoders(GAE), and spatial–temporal GNNs(S

Neighborhood Homophily-based Graph Convolutional Network

#paper/ccfB 推荐指数: #paper/⭐ #pp/图结构学习 流程 重定义同配性指标: N H i k = ∣ N ( i , k , c m a x ) ∣ ∣ N ( i , k ) ∣ with c m a x = arg ⁡ max ⁡ c ∈ [ 1 , C ] ∣ N ( i , k , c ) ∣ NH_i^k=\frac{|\mathcal{N}(i,k,c_{

兔子-在as中删除项目以及删除后报错already disposed:Module:'haha'

1. 2.点左上角红色的减号,,Apply 3,删除setting.gradle中include中的要删除的项目 . 4.选择要删除的项目,,点击键盘的delete键 5.点击第二个图标。 删除成功!! 完全删除haha项目之后,仍然报这个错误。 解决办法:重启as

lua data time

local getTime = os.date(“%c”); 其中的%c可以是以下的一种:(注意大小写) %a abbreviated weekday name (e.g., Wed) %A full weekday name (e.g., Wednesday) %b abbreviated month name (e.g., Sep) %B full month name (e.g., Sep

解决RuntimeError: Numpy is not available

运行项目时,遇到RuntimeError: Numpy is not available 这是因为Numpy 版本太高,将现有Numpy卸载 pip uninstall numpy 安装numpy=1.26.4,解决此问题 pip install numpy=1.26.4 -i https://pypi.tuna.tsinghua.edu.cn/simple