PyTorch构建CIFAR100卷积网时Adam优化器空参数列表错误求助
解决PyTorch中Adam优化器"optimizer got an empty parameter list"错误
你遇到的错误核心原因是模型层没有被注册为PyTorch模型的子模块:在CNN类的__init__方法里,你定义的卷积层和全连接层都是局部变量(比如conv1=nn.Conv2d(...)),没有用self.绑定为模型的成员属性。PyTorch的model.parameters()只会收集那些被注册的子模块参数,局部变量的参数不会被纳入,所以优化器拿到的参数列表是空的。
修改方法很简单,把__init__里所有层的定义加上self.前缀,让它们成为模型的成员:
class CNN(nn.Module): def __init__(self,k): super(CNN,self).__init__() # Convolutional layer self.conv1 = nn.Conv2d(3,32,kernel_size=3,padding='same') self.conv2 = nn.Conv2d(32,64,kernel_size=3,padding='same') self.conv3 = nn.Conv2d(64,128,kernel_size=3,padding='same') self.conv4 = nn.Conv2d(128,128,kernel_size=3,padding='same') self.conv5 = nn.Conv2d(128,256,kernel_size=3,padding='same') self.conv6 = nn.Conv2d(256,256,kernel_size=3,padding='same') # feedforward layer self.f1 = nn.Linear(4*4*256,4096) self.f2 = nn.Linear(4096,k) def forward(self,x): x = f.relu(self.conv1(x)) x = f.relu(self.conv2(x)) x = f.max_pool2d(x,kernel_size=2,stride=2) x = f.relu(self.conv3(x)) x = f.relu(self.conv4(x)) x = f.max_pool2d(x,kernel_size=2,stride=2) x = f.relu(self.conv5(x)) x = f.relu(self.conv6(x)) x = f.max_pool2d(x,kernel_size=2,stride=2) x = x.view(-1,4*4*256) x = f.relu(self.f1(x)) x = self.f2(x) return x
修改后,model.parameters()就能正确获取到所有卷积层和全连接层的可训练参数,初始化Adam优化器时就不会再报空参数列表的错误了。你的模型初始化代码不需要修改,保持原样即可。
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

