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

sac*_*ruk 1 pytorch

我创建了以下简单的线性类:

class Decoder(nn.Module):
    def __init__(self, K, h=()):
        super().__init__()
        h = (K,)+h+(K,)
        self.layers = [nn.Linear(h1,h2) for h1,h2 in zip(h, h[1:])]

    def forward(self, x):
        for layer in self.layers[:-1]:
            x = F.relu(layer(x))
        return self.layers[-1](x)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将参数放在优化器类中时,我得到了错误ValueError: optimizer got an empty parameter list

decoder = Decoder(4)
LR = 1e-3
opt = optim.Adam(decoder.parameters(), lr=LR)
Run Code Online (Sandbox Code Playgroud)

类定义有什么我做的明显错误吗?

Sha*_*hai 6

由于您将层存储在Decoder.py中的常规pythonic列表中,Pytorch 无法告诉这些成员self.list实际上是子模块。将此列表转换为pytorch nn.ModuleList,您的问题将得到解决

class Decoder(nn.Module):
    def __init__(self, K, h=()):
        super().__init__()
        h = (K,)+h+(K,)
        self.layers = nn.ModuleList(nn.Linear(h1,h2) for h1,h2 in zip(h, h[1:]))
Run Code Online (Sandbox Code Playgroud)