类型错误:';非类型';对象在丢失时不可删除。在pytorch中向后
我正在尝试使用动态图库(DGL)的图卷积网络(GCN)实现一个深度Q网络(DQN)。基本代码取自此。但是,在计算策略网络和目标网络之间的损失并运行类型错误:';非类型';对象在丢失时不可删除。在pytorch中向后,pytorch,Pytorch,我正在尝试使用动态图库(DGL)的图卷积网络(GCN)实现一个深度Q网络(DQN)。基本代码取自此。但是,在计算策略网络和目标网络之间的损失并运行loss.backward()后,我得到TypeError:“NoneType”对象不可编辑。我已经打印了损失值,但它不是None 我从存储库中运行了原始代码,它运行得非常完美。我还在DGL中实现了GCN代码,它似乎正在运行。我还使用torchviz可视化了图形,但我无法找到它给出错误的原因 下面给出了代码片段: target=return\u ten
loss.backward()
后,我得到TypeError:“NoneType”对象不可编辑。我已经打印了损失值,但它不是None
我从存储库中运行了原始代码,它运行得非常完美。我还在DGL中实现了GCN代码,它似乎正在运行。我还使用torchviz
可视化了图形,但我无法找到它给出错误的原因
下面给出了代码片段:
target=return\u tens+self.gamma*torch.max(self.model\u target(observation\u tens,self.G)+observation\u tens*(-1e5),dim=1)[0]
当前值=self.model(最后观察值,self.G)
下一个值=当前值。克隆()
当前_q_值[范围(self.minibatch_长度),操作数,:]=目标
L=自身标准(当前值、下一个值)
打印('损失:',L.项目())
self.optimizer.zero_grad()
L.向后(保留图=真)
self.optimizer.step()
损失:1461729.125
TypeError回溯(最近一次调用)
在()
62
63如果名称=“\uuuuu main\uuuuuuu”:
--->64 main()
7帧
大体上
55打印(“运行单实例模拟…”)
56 my_runner=runner(环境类、代理类、args.verbose)
--->57最终奖励=我的跑步者循环(图dic,args.ngames,args.epoch,args.niter)
58打印(“获得{}的最终奖励”。格式(最终奖励))
59代理_类。保存_模型()
循环中(自我、图形、游戏、nbr_epoch、max_iter)
45#如果self.verbose:
46#打印(“模拟步骤{}:.format(i))
--->47(obs,act,rew,done)=self.step()
48行动清单。附加(行动)
49
步调一致(自我)
16#奖励=火炬。张量([奖励],装置=装置)
17
--->18自我激励奖励(观察、行动、奖励、完成)
19
20返回(观察、行动、奖励、完成)
奖励(自我、观察、行动、奖励、完成)
129打印('损失:',L.项目())
130 self.optimizer.zero_grad()
-->131 L.向后(保留图=真)
132 self.optimizer.step()
133
/usr/local/lib/python3.6/dist-packages/torch/tensor.py in backward(self、gradient、retain\u图、create\u图)
148种产品。默认值为“False”。
149 """
-->150火炬。自动标记。向后(自我、梯度、保留图、创建图)
151
152 def寄存器挂钩(自身,挂钩):
/usr/local/lib/python3.6/dist packages/torch/autograd/________.py向后(张量、梯度张量、保留图、创建图、梯度变量)
97变量。\u执行\u引擎。向后运行\u(
98张量,梯度张量,保留图,创建图,
--->99 allow_unreachable=True)#allow_unreachable标志
100
101
/应用中的usr/local/lib/python3.6/dist-packages/torch/autograd/function.py(self,*args)
75
76 def应用(自身,*参数):
--->77返回self.\u向前\u cls.向后(self,*args)
78
79
/usr/local/lib/python3.6/dist-packages/dgl/backend/pytorch/tensor.py反向输入(ctx,渐变输出)
394 def向后(ctx,渐变输出):
395减速机,图形,目标,输入映射,输出映射,输入数据,输出数据,degs\
-->396=ctx.backward\u缓存
397 ctx.backward\u缓存=无
398梯度=无
TypeError:“非类型”对象不可编辑
更新:通过在主分支上从源代码构建解决问题。
查看此文件了解详细信息
因此,在DGL中生成随机图的玩具数据集时,我遇到了同样的问题。对于每个图,我使用G.update_all(fn.copy_e('msg')、fn.sum('msg')、'c'))
和target=DGL.sum_节点(G,'c')
。调用loss.backward()
时,我得到了与您相同的错误
我通过在创建DataLoader
对象的周围添加torch.no_grad()
修复了这个问题,因此loss.backward()
不会调用target
中的backward()
函数,其中ctx.backward\u缓存=None
,当copyruce()的向前()
函数
在此之前未调用中的类
我不确定我的修正是否直接适用于您的问题,但您应该检查在此之前是否有向后传递而没有向前传递,或者损失函数中的张量在图中引用相同的计算,从而调用backward()
两次
我希望这能有所帮助。更新:通过在主分支上从源代码构建解决问题。 查看此文件了解详细信息 因此,在DGL中生成随机图的玩具数据集时,我遇到了同样的问题。对于每个图,我使用
G.update_all(fn.copy_e('msg')、fn.sum('msg')、'c'))
和target=DGL.sum_节点(G,'c')
。调用loss.backward()
时,我得到了与您相同的错误
我通过在创建DataLoader
对象的周围添加torch.no_grad()
修复了这个问题,因此loss.backward()
不会调用target
中的backward()
函数,其中ctx.backward\u缓存=None
,当copyruce()的向前()
函数
在此之前未调用中的类
我不确定我的修正是否直接适用于你的问题,但你应该检查你是否有一个没有forwa的向后传球
TypeError Traceback (most recent call last)
<ipython-input-17-cd5e862dd609> in <module>()
62
63 if __name__ == "__main__":
---> 64 main()
7 frames
<ipython-input-17-cd5e862dd609> in main()
55 print("Running a single instance simulation...")
56 my_runner = Runner(env_class, agent_class, args.verbose)
---> 57 final_reward = my_runner.loop(graph_dic,args.ngames,args.epoch, args.niter)
58 print("Obtained a final reward of {}".format(final_reward))
59 agent_class.save_model()
<ipython-input-14-45cfc883a37b> in loop(self, graphs, games, nbr_epoch, max_iter)
45 # if self.verbose:
46 # print("Simulation step {}:".format(i))
---> 47 (obs, act, rew, done) = self.step()
48 action_list.append(act)
49
<ipython-input-14-45cfc883a37b> in step(self)
16 #reward = torch.tensor([reward], device=device)
17
---> 18 self.agent.reward(observation, action, reward,done)
19
20 return (observation, action, reward, done)
<ipython-input-16-76d612e8663c> in reward(self, observation, action, reward, done)
129 print('loss:',L.item())
130 self.optimizer.zero_grad()
--> 131 L.backward(retain_graph=True)
132 self.optimizer.step()
133
/usr/local/lib/python3.6/dist-packages/torch/tensor.py in backward(self, gradient, retain_graph, create_graph)
148 products. Defaults to ``False``.
149 """
--> 150 torch.autograd.backward(self, gradient, retain_graph, create_graph)
151
152 def register_hook(self, hook):
/usr/local/lib/python3.6/dist-packages/torch/autograd/__init__.py in backward(tensors, grad_tensors, retain_graph, create_graph, grad_variables)
97 Variable._execution_engine.run_backward(
98 tensors, grad_tensors, retain_graph, create_graph,
---> 99 allow_unreachable=True) # allow_unreachable flag
100
101
/usr/local/lib/python3.6/dist-packages/torch/autograd/function.py in apply(self, *args)
75
76 def apply(self, *args):
---> 77 return self._forward_cls.backward(self, *args)
78
79
/usr/local/lib/python3.6/dist-packages/dgl/backend/pytorch/tensor.py in backward(ctx, grad_out)
394 def backward(ctx, grad_out):
395 reducer, graph, target, in_map, out_map, in_data_nd, out_data_nd, degs \
--> 396 = ctx.backward_cache
397 ctx.backward_cache = None
398 grad_in = None
TypeError: 'NoneType' object is not iterable