Deep learning 了解何时在Pytorch中使用python列表
基本上正如本线程所讨论的,您不能使用pythonlist来包装您的子模块(例如您的层);否则,Pytorch不会更新列表中子模块的参数。相反,您应该使用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
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列表中存储张量列表。向后调用时
需要位于标量张量上,因此是连接的总和。这些张量是损失而不是参数,因此它们不应该是模块的属性,也不应该被包装在模块列表中