Neural network RuntimeError:第二次尝试向后遍历图形,但已释放保存的中间结果

Neural network RuntimeError:第二次尝试向后遍历图形,但已释放保存的中间结果,neural-network,pytorch,autograd,Neural Network,Pytorch,Autograd,我得到了像标题一样的错误…我找到了一些答案,所以我尝试retain\u graph=True,但它不起作用。也许我的代码遇到了另一个问题(它发生在丢失\u actor.backward(retain\u grah….)中) q=torch.zero(len(奖励)) q_目标=火炬0(镜头(奖励)) 对于枚举中的j,r(奖励): q_目标[j]=自评网络(火炬转置(下一个火炬状态[j],0,1),自参与者网络(火炬转置(下一个火炬状态[j],0,1))。视图(1,1)) q_目标[j]=r+(完

我得到了像标题一样的错误…我找到了一些答案,所以我尝试
retain\u graph=True
,但它不起作用。也许我的代码遇到了另一个问题(它发生在
丢失\u actor.backward(retain\u grah….)
中)

q=torch.zero(len(奖励))
q_目标=火炬0(镜头(奖励))
对于枚举中的j,r(奖励):
q_目标[j]=自评网络(火炬转置(下一个火炬状态[j],0,1),自参与者网络(火炬转置(下一个火炬状态[j],0,1))。视图(1,1))
q_目标[j]=r+(完成[j]*伽马*q_目标[j])。分离()
q[j]=self.critic_网络(火炬转置(状态[j],0,1),动作[j].视图(1,1))
损耗=F.mse\u损耗(q,q\u目标)
self.critic\u optimizer.zero\u grad()
损失(向后)
self.critic\u优化器.step()
b=火炬零点(透镜(奖励))
对于枚举中的j,r(奖励):
b[j]=self.critic_网络(torch.transpose(状态[j],0,1),self.actor_网络(torch.transpose(状态[j],0,1))。视图(1,1))
损失系数=-火炬平均值(b)
self.actor\u optimizer.zero\u grad()
向后损失(保留图=真)
self.actor\u optimizer.step()

根据提供的关于计算图部分的信息,我假设
loss\u actor
loss\u critic
共享部分,我认为其
状态
(不确定)

state->q-->丢失\u批评家b-->丢失\u参与者12 l2.backward()
RuntimeError:第二次尝试向后遍历图形,但已释放保存的中间结果。第一次向后调用时指定retain_graph=True。
尝试

。。。
l2.向后(保留图=真)
没用,因为你必须这么做

第一次向后调用时指定retain_graph=True

这里,在第一次向后调用时(对于
l1

l1.向后(retain\u graph=True)

非常感谢。我意识到了这个问题,我修改了它。但现在我得到了另一个新东西:我有两个代理,所以相同的网络:a和b。他们使用相同的数据,但是如果一个人更新了梯度,另一个人就会出错:梯度计算所需的一个变量被一个就地操作修改了。在我看来,状态在第一次更新时会发生变化,所以在第二次更新时会导致错误。“有没有办法避免?”