我尝试在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中初始化参数,但我不知道如何处理它。非常感谢你!
答案 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)