优化器在pytorch中有一个空的参数列表

时间:2018-06-22 06:27:43

标签: pytorch

我尝试在VAE实验中使用卷积网络结构,代码类似于:

Class CNN(nn.Module):...

hparams1=[...]
hparams2=[...]

Model1=CNN(hyparams1)
Model2=CNN(hyparams2)

def VAE(x):
   encoder=Model1(x)
   z=reparameterize(encoder)  #reparameterize is defined
   decoder=Model2(z)
   return decoder

if args.cuda:
    Model1.cuda()
    Model2.cuda()

parameters = chain(Model1.parameters(), Model2.parameters())
optimizer = optim.Adam(parameters, lr=1e-3)

Error:Optimizer got an empty parameter list.

当我将VAE定义为类时,会发生相同的问题:

class VAE(nn.Module):
  def encoder(x,model):
     return model(x)

  def reparameterize():

  def decoder(z,model):
     return model(z)

  def forward(x,Model1,Model2)
     output=encoder(x,Model1)
     z=reparameterize(output)
     return decoder(z,Model2)

model=VAE()
optimizer = optim.Adam(model.parameters(), lr=1e-3)

Error:Optimizer got an empty parameter list.

我猜可能是我无法在类VAE中初始化参数,但我不知道如何处理它。非常感谢你!

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您可以使用:

parameters = list(Model1.parameters())+ list(Model2.parameters())
optimizer = optim.Adam(parameters, lr=1e-3)

在第二种情况下,您没有创建对象,因此基本上可以尝试这样做:

model = VAE()
optimizer = optim.Adam(model.parameters(), lr=1e-3)

顺便说一句,您可以从修改Pytorch提供的VAE example开始。

编辑

也许您错过了初始功能或以错误的方式初始化了模型。在此处查看init函数。

希望有帮助。

答案 1 :(得分:0)

我知道了。

Class CNN(nn.Module):...

hparams1=[...]
hparams2=[...]

class VAE(nn.Module):

    self.Model1=CNN(hyparams1)
    self.Model2=CNN(hyparams2)

  def encoder(x,model):
     return model(x)

  def reparameterize():

  def decoder(z,model):
     return model(z)

  def forward(x)
     output=encoder(x,self.Model1)
     z=reparameterize(output)
     return decoder(z,self.Model2)

model=VAE()
optimizer = optim.Adam(model.parameters(), lr=1e-3)