You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:25:36