我创建以下简单的线性类:
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)
但是,当我尝试将参数放入优化器类时,出现错误ValueError: optimizer got an empty parameter list
。
decoder = Decoder(4)
LR = 1e-3
opt = optim.Adam(decoder.parameters(), lr=LR)
我在做类定义时显然做错了吗?
答案 0 :(得分:2)
由于您将图层存储在Decoder
内的常规pythonic列表中,因此Pytorch无法告知self.list
的这些成员实际上是子模块。将此列表转换为pytorch的{{3}},您的问题将得到解决
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:]))