Pytorch ValueError: optimizer got an empty parameter list
Pytorch ValueError: optimizer got an empty parameter list
尝试创建神经网络并使用 Pytorch 对其进行优化时,我得到
ValueError: optimizer got an empty parameter list
这是代码。
import torch.nn as nn
import torch.nn.functional as F
from os.path import dirname
from os import getcwd
from os.path import realpath
from sys import argv
class 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's tutorial code 中找到的示例。
我无法真正分辨出我的代码与他们的代码之间的区别,这让我认为它没有需要优化的参数。
如何使我的网络具有链接示例中的参数?
您的 NetActor
不直接存储任何 nn.Parameter
。此外,它最终在 forward
中使用的所有其他层都存储为 简单 列表 self.nn_layers
.
如果你想让 self.actor_nn.parameters()
知道存储在列表 self.nn_layers
中的项目可能包含可训练的参数,你应该使用 containers.
具体来说,使 self.nn_layers
成为 nn.ModuleList
而不是简单列表应该可以解决您的问题:
self.nn_layers = nn.ModuleList()
尝试创建神经网络并使用 Pytorch 对其进行优化时,我得到
ValueError: optimizer got an empty parameter list
这是代码。
import torch.nn as nn
import torch.nn.functional as F
from os.path import dirname
from os import getcwd
from os.path import realpath
from sys import argv
class 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's tutorial code 中找到的示例。
我无法真正分辨出我的代码与他们的代码之间的区别,这让我认为它没有需要优化的参数。
如何使我的网络具有链接示例中的参数?
您的 NetActor
不直接存储任何 nn.Parameter
。此外,它最终在 forward
中使用的所有其他层都存储为 简单 列表 self.nn_layers
.
如果你想让 self.actor_nn.parameters()
知道存储在列表 self.nn_layers
中的项目可能包含可训练的参数,你应该使用 containers.
具体来说,使 self.nn_layers
成为 nn.ModuleList
而不是简单列表应该可以解决您的问题:
self.nn_layers = nn.ModuleList()