在尝试创建一个神经网络并使用Pytorch进行优化时,我遇到了
ValueError: optimizer got an empty parameter list
以下是代码。
import torch.nn as nnimport torch.nn.functional as Ffrom os.path import dirnamefrom os import getcwdfrom os.path import realpathfrom sys import argvclass NetActor(nn.Module): def __init__(self, args, state_vector_size, action_vector_size, hidden_layer_size_list): super(NetActor, self).__init__() self.args = args self.state_vector_size = state_vector_size self.action_vector_size = action_vector_size self.layer_sizes = hidden_layer_size_list self.layer_sizes.append(action_vector_size) self.nn_layers = [] self._create_net() def _create_net(self): prev_layer_size = self.state_vector_size for next_layer_size in self.layer_sizes: next_layer = nn.Linear(prev_layer_size, next_layer_size) prev_layer_size = next_layer_size self.nn_layers.append(next_layer) def forward(self, torch_state): activations = torch_state for i,layer in enumerate(self.nn_layers): if i != len(self.nn_layers)-1: activations = F.relu(layer(activations)) else: activations = layer(activations) probs = F.softmax(activations, dim=-1) return probs
然后是调用
self.actor_nn = NetActor(self.args, 4, 2, [128]) self.actor_optimizer = optim.Adam(self.actor_nn.parameters(), lr=args.learning_rate)
给出了非常明确的错误
ValueError: optimizer got an empty parameter list
我很难理解网络定义中的哪部分使得网络拥有参数。
我正在遵循并扩展我在Pytorch教程代码中找到的示例。
我实在无法分辨我的代码和他们的代码之间的区别,这使得我的代码认为它没有参数可以优化。
如何使我的网络像链接的示例那样拥有参数?
回答:
你的NetActor
并没有直接存储任何nn.Parameter
。此外,它最终在forward
中使用的所有其他层都以一个简单列表的形式存储在self.nn_layers
中。
如果你希望self.actor_nn.parameters()
知道存储在列表self.nn_layers
中的项目可能包含可训练参数,你应该使用容器。
具体来说,将self.nn_layers
变成一个nn.ModuleList
而不是一个简单的列表应该可以解决你的问题:
self.nn_layers = nn.ModuleList()