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
我想从模型中提取一些层,所以我写
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