Pytorch: TypeError: list is not a Module subclass

Pytorch: TypeError: list is not a Module subclass

我想从模型中提取一些层,所以我写

nn.Sequential(list(model.children())[:7])

但出现错误:list 不是 Module 子类。我知道我应该写

nn.Sequential(*list(model.children)[:7])

但为什么我必须添加 * ??? 如果我只想得到包含图层的[],我必须写

layer = list(model.children())[:7]
but not
layer = *list(model.children())[:7]

在这种情况下,* 不起作用并出现错误

    layer = *list(model_ft.children())[:3]
           ^
SyntaxError: can't use starred expression here

为什么???

list(model.children())[:7] returns一个列表,但是nn.Sequential()的输入要求模块是OrderedDict或者直接添加,而不是在python列表中。

nn.Sequential Modules will be added to it in the order they are passed in the constructor. Alternatively, an OrderedDict of modules can be passed in.

# nn.Sequential(list(model.children)[:3]) means, which is wrong
nn.Sequential([Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3)),
ReLU(inplace=True),
MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)])

# nn.Sequential(*list(model.children)[:3]) mean
nn.Sequential(Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3)),
ReLU(inplace=True),
MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False))

这就是您需要使用 * 解压列表的原因。它只能在函数内部使用,因此在您的最后一种情况下不起作用。阅读* in python