【问题标题】:Why "ValueError: optimizer got an empty parameter list" is happened in this case?为什么在这种情况下会发生“ValueError: optimizer got a empty parameter list”?
【发布时间】:2020-08-26 02:48:12
【问题描述】:

我已经研究了关于这个主题的问题,我只看到了使用 ModuleList 而不是通常的列表的建议。但是我不明白为什么在我使用nn.Sequential的情况下会出现这个错误? 我尝试在这里的官方实现中构建 AlexNet:https://github.com/pytorch/vision/blob/master/torchvision/models/alexnet.py 但得到“ValueError:优化器得到一个空参数列表”

class AlexNet(nn.Module):

def __init__(self, input_channels, n_classes=1000):
    super(AlexNet, self).__init__()

    self.features = nn.Sequential
    (
        nn.Conv2d(input_channels, 96, kernel_size=11, stride=4),
        nn.LocalResponseNorm(size=2, alpha=2e-5),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.ReLU(inplace=True),

        nn.Conv2d(96, 256, kernel_size=5, stride=1),
        nn.LocalResponseNorm(size=2, alpha=2e-5),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.ReLU(inplace=True),

        nn.Conv2d(256, 384, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),

        nn.Conv2d(384, 384, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),

        nn.Conv2d(384, 256, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),

    )

    self.fully_connected = nn.Sequential
    (
        nn.Dropout2d(0.5),
        nn.Linear(256, 4096),
        nn.ReLU(inplace=True),
        nn.Linear(4096, 4096),
        nn.ReLU(inplace=True),
        nn.Linear(4096, n_classes)
    )

def forward(self, x):

    x = self.features(x)
    x = nn.Flatten(x)
    x = self.fully_connected(x)

    return x

model = AlexNet(input_channels=1, n_classes=10)
optimizer = optim.Adam(model.parameters() , lr=1e-3)

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    您实际上并未创建nn.Sequential 模块,但您已将nn.Sequential 类分配给self.featuresself.fully_connected。括号在下一行,在创建元组的 Python 中,因为它不跟随标识符,换行符通常终止语句,但有一些例外,例如左括号。

    左括号需要在同一行:

    self.features = nn.Sequential(
        nn.Conv2d(input_channels, 96, kernel_size=11, stride=4),
        nn.LocalResponseNorm(size=2, alpha=2e-5),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.ReLU(inplace=True),
        nn.Conv2d(96, 256, kernel_size=5, stride=1),
        nn.LocalResponseNorm(size=2, alpha=2e-5),
        nn.MaxPool2d(kernel_size=3, stride=2),
        nn.ReLU(inplace=True),
        nn.Conv2d(256, 384, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),
        nn.Conv2d(384, 384, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),
        nn.Conv2d(384, 256, kernel_size=3, stride=1),
        nn.ReLU(inplace=True),
    )
    
    self.fully_connected = nn.Sequential(
        nn.Dropout2d(0.5),
        nn.Linear(256, 4096),
        nn.ReLU(inplace=True),
        nn.Linear(4096, 4096),
        nn.ReLU(inplace=True),
        nn.Linear(4096, n_classes),
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2013-08-02
      • 2018-12-19
      • 1970-01-01
      相关资源
      最近更新 更多