Pytorch ValueError:优化器得到一个空的参数列表

Posted

技术标签:

【中文标题】Pytorch ValueError:优化器得到一个空的参数列表【英文标题】:Pytorch ValueError: optimizer got an empty parameter list 【发布时间】:2019-07-07 19:12:57 【问题描述】:

当尝试创建一个神经网络并使用 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's tutorial code 中找到的示例。

我无法真正区分我的代码和他们的代码之间的区别,这让我认为它没有要优化的参数。

如何让我的网络具有链接示例的参数?

【问题讨论】:

【参考方案1】:

您的NetActor 不直接存储任何nn.Parameter。此外,它最终在 forward 中使用的所有其他层都存储为 simple 列表是 self.nn_layers。 如果您想让self.actor_nn.parameters() 知道存储在列表self.nn_layers 中的项目可能包含可训练的参数,您应该使用containers。 具体来说,将 self.nn_layers 设为 nn.ModuleList 而不是简单的列表应该可以解决您的问题:

self.nn_layers = nn.ModuleList()

【讨论】:

谢谢!它似乎已经解决了这个问题。如果我想在未来解决类似的问题,什么是正确的资源(除了阅读整个 pytorch 代码和文档)? @Gulzar 你可以随时在这里或在 pytorch 的论坛中提问 两年后回到这里。再次感谢您! @Gulzar 总是很开心

以上是关于Pytorch ValueError:优化器得到一个空的参数列表的主要内容,如果未能解决你的问题,请参考以下文章

Anaconda:ValueError:无法解释优化器标识符

PyTorch:将预训练模型从 3 个 RGB 通道更改为 4 个通道后,出现“ValueError:无法优化非叶张量”

Task6.PyTorch理解更多神经网络优化方法

Pytorch优化器全总结常用优化器性能对比 含代码

ValueError:您在优化器 RMSprop 上调用了“set_weights(weights)”,权重列表长度为 3,但优化器期望权重为 0

Pytorch优化器全总结牛顿法BFGSL-BFGS 含代码