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。他们使用相同的数据,但是如果一个人更新了梯度,另一个人就会出错:梯度计算所需的一个变量被一个就地操作修改了。在我看来,状态在第一次更新时会发生变化,所以在第二次更新时会导致错误。“有没有办法避免?”