Python Pytorch参数()在收集到列表或保存在生成器中时表现不同
TL;DR-使用生成器失败,使用列表成功。为什么? 我正在尝试手动更改模型的参数,如下所示: (第1代码,工程) 而且它似乎在100%的时间里收敛于正确的结果 但是, 尝试使用这样的函数时: (第二个代码,失败) 然后Python Pytorch参数()在收集到列表或保存在生成器中时表现不同,python,list,reference,generator,pytorch,Python,List,Reference,Generator,Pytorch,TL;DR-使用生成器失败,使用列表成功。为什么? 我正在尝试手动更改模型的参数,如下所示: (第1代码,工程) 而且它似乎在100%的时间里收敛于正确的结果 但是, 尝试使用这样的函数时: (第二个代码,失败) 然后 delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data negative_expected_reward_from_t = -expected
delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data
negative_expected_reward_from_t = -expected_reward_from_t
self.critic_optimizer.zero_grad()
negative_expected_reward_from_t.backward()
self._update_grads(delta=delta,
discount=discount)
self.critic_optimizer.step()
这似乎是我做的唯一一件事,就是把self.critic\n.parameters()放入一个临时局部变量params
现在网络无法融合。
(第三个代码同样有效)
在方法\u update\u grads
中替换时:params=self.critic\u nn.parameters()
为params=list(self.critic\u nn.parameters())
现在,再次恢复了趋同
这似乎是一个参考问题,在PyTorch中,我并不完全理解。我似乎不完全理解参数()返回的内容
问题:
为什么第一个和第三个代码可以工作,而第二个代码不能工作?在第二个示例中,您的代码
p.grad[:]…
似乎不在循环中。在stackoverflow上粘贴时无意中发生了吗?@kHarshit是的。现在编辑。@Gulzar它返回一个生成器,正如您从中看到的。起初,“网络不收敛”听起来更像是算法问题,而不是编程问题。源代码没有显示耗尽生成器的任何副作用,因此不收敛似乎是由不同的原因造成的。您是否确保了这三种情况之间的完全可比性(在初始化、随机性等方面)?显示周围的代码也会很有帮助。@a_guest唯一的区别是使用列表或生成器。既然问题不是关于算法的,我想我不会向你透露细节。在每种情况下,行为都是不同的,随机种子总是相同的。案例1和案例3收敛于某个(错误的)值,案例2根本不收敛。更多详细信息,请参见@Gulzar。然而,就目前的问题而言,这个问题是不可复制的。正如我提到的,生成器函数没有任何副作用,所以我认为问题出在代码的其他地方。如果你能提供一个答案,这将增加问题被回答的机会。在第二个例子中,你的代码p.grad[:]…
似乎是不正常的。在stackoverflow上粘贴时无意中发生了吗?@kHarshit是的。现在编辑。@Gulzar它返回一个生成器,正如您从中看到的。起初,“网络不收敛”听起来更像是算法问题,而不是编程问题。源代码没有显示耗尽生成器的任何副作用,因此不收敛似乎是由不同的原因造成的。您是否确保了这三种情况之间的完全可比性(在初始化、随机性等方面)?显示周围的代码也会很有帮助。@a_guest唯一的区别是使用列表或生成器。既然问题不是关于算法的,我想我不会向你透露细节。在每种情况下,行为都是不同的,随机种子总是相同的。案例1和案例3收敛于某个(错误的)值,案例2根本不收敛。更多详细信息,请参见@Gulzar。然而,就目前的问题而言,这个问题是不可复制的。正如我提到的,生成器函数没有任何副作用,所以我认为问题出在代码的其他地方。如果你能提供一个答案,这将增加问题被回答的机会。
def _update_grads(self,delta, discount):
params = self.critic_nn.parameters()
for i, p in enumerate(params):
if not p.requires_grad:
continue
p.grad[:] = delta.squeeze() * discount * p.grad
delta = r_t + gamma * expected_reward_from_t1.data - expected_reward_from_t.data
negative_expected_reward_from_t = -expected_reward_from_t
self.critic_optimizer.zero_grad()
negative_expected_reward_from_t.backward()
self._update_grads(delta=delta,
discount=discount)
self.critic_optimizer.step()