Pytorch ValueError: оптимизатор получил пустой список параметров - PullRequest
0 голосов
/ 13 февраля 2019

При попытке создать нейронную сеть и оптимизировать ее с помощью Pytorch я получаю

ValueError: оптимизатор получил пустой список параметров

Вот код.

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: оптимизатор получил пустой список параметров

Мне трудно понять, что именно в определении сети делает сеть имеющей параметры.

Я следую и расширяю пример, который нашел в Код учебника Pytorch .

Я не могу понять разницу между моим кодом и его кодом, который заставляет мой думать, что у него нет параметров для оптимизации.

Как сделать так, чтобы в моей сети были параметры, подобные связанному примеру?

1 Ответ

0 голосов
/ 14 февраля 2019

Ваш NetActor не хранит напрямую nn.Parameter.Более того, все остальные слои, которые он в конечном итоге использует в forward, сохраняются в виде простого списка self.nn_layers.
Если вы хотите, чтобы self.actor_nn.parameters() знал, что элементы, хранящиеся в списке self.nn_layersможет содержать обучаемые параметры, вы должны работать с контейнерами .
В частности, решение self.nn_layers как nn.ModuleList вместо простого списка должно решить вашу проблему:

self.nn_layers = nn.ModuleList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...