Deep learning 了解何时在Pytorch中使用python列表

Deep learning 了解何时在Pytorch中使用python列表,deep-learning,pytorch,backpropagation,Deep Learning,Pytorch,Backpropagation,基本上正如本线程所讨论的,您不能使用pythonlist来包装您的子模块(例如您的层);否则,Pytorch不会更新列表中子模块的参数。相反,您应该使用nn.ModuleList来包装子模块,以确保它们的参数将被更新。现在我也看到了下面这样的代码,作者使用python列表计算损失,然后执行loss.backward()进行更新(在RL的增强算法中)。代码如下: policy_loss = [] for log_prob in self.controller.log_probabilit

基本上正如本线程所讨论的,您不能使用pythonlist来包装您的子模块(例如您的层);否则,Pytorch不会更新列表中子模块的参数。相反,您应该使用
nn.ModuleList
来包装子模块,以确保它们的参数将被更新。现在我也看到了下面这样的代码,作者使用python列表计算损失,然后执行
loss.backward()
进行更新(在RL的增强算法中)。代码如下:

 policy_loss = []
    for log_prob in self.controller.log_probability_slected_action_list:
        policy_loss.append(- log_prob * (average_reward - b))
    self.optimizer.zero_grad()
    final_policy_loss = (torch.cat(policy_loss).sum()) * gamma
    final_policy_loss.backward()
    self.optimizer.step()

为什么以这种格式使用列表可以更新模块的参数,但第一种情况不起作用?我现在很困惑。如果我更改了前面的代码
policy\u loss=nn.ModuleList([])
,它会抛出一个异常,表明张量浮点不是子模块

您误解了
模块是什么。
模块
存储参数并定义正向传递的实现


您可以使用张量和参数执行任意计算,从而生成其他新的张量<代码>模块
不需要知道这些张量。您还可以在Python列表中存储张量列表。向后调用
需要位于标量张量上,因此是连接的总和。这些张量是损失而不是参数,因此它们不应该是
模块的属性,也不应该被包装在
模块列表中
您误解了
模块的含义。
模块
存储参数并定义正向传递的实现

您可以使用张量和参数执行任意计算,从而生成其他新的张量<代码>模块
不需要知道这些张量。您还可以在Python列表中存储张量列表。向后调用
需要位于标量张量上,因此是连接的总和。这些张量是损失而不是参数,因此它们不应该是
模块的属性,也不应该被包装在
模块列表中