Python Pytorch参数()在收集到列表或保存在生成器中时表现不同

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

TL;DR-使用生成器失败,使用列表成功。为什么?

我正在尝试手动更改模型的参数,如下所示:

(第1代码,工程)

而且它似乎在100%的时间里收敛于正确的结果

但是,

尝试使用这样的函数时:

(第二个代码,失败)

然后

       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()