pytorch中resnet_如何从PyTorch中的ResNet模型中删除最后一个FC层?

2023-05-16

我使用的是来自PyTorch的ResNet152模型。我想从模型中去掉最后一个FC层。这是我的代码:from torchvision import datasets, transforms, models

model = models.resnet152(pretrained=True)

print(model)

当我打印模型时,最后几行如下所示:(2): Bottleneck(

(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(relu): ReLU(inplace)

)

)

(avgpool): AvgPool2d(kernel_size=7, stride=1, padding=0)

(fc): Linear(in_features=2048, out_features=1000, bias=True)

)

我想从模型中删除最后一个fc层。list(model.modules()) # to inspect the modules of your model

my_model = nn.Sequential(*list(model.modules())[:-1]) # strips off last linear layer

所以我在代码中添加了如下代码行:model = models.resnet152(pretrained=True)

list(model.modules()) # to inspect the modules of your model

my_model = nn.Sequential(*list(model.modules())[:-1]) # strips off last linear layer

print(my_model)

但这段代码并不像宣传的那样工作——至少对我来说不是。这篇文章的其余部分详细解释了为什么这个答案不起作用,这样这个问题就不会作为一个重复而结束。

首先,打印出来的模型比以前大了近5倍。我看到的是和以前一样的模型,但是后面的模型似乎是重复的,但可能是扁平的。(2): Bottleneck(

(conv1): Conv2d(2048, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(conv3): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)

(bn3): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(relu): ReLU(inplace)

)

)

(avgpool): AvgPool2d(kernel_size=7, stride=1, padding=0)

(fc): Linear(in_features=2048, out_features=1000, bias=True)

)

(1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)

(2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(3): ReLU(inplace)

(4): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)

(5): Sequential(

. . . this goes on for ~1600 more lines . . .

(415): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(416): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

(417): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(418): Conv2d(512, 2048, kernel_size=(1, 1), stride=(1, 1), bias=False)

(419): BatchNorm2d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

(420): ReLU(inplace)

(421): AvgPool2d(kernel_size=7, stride=1, padding=0)

)

其次,fc层仍在那里,而Conv2D层看起来就像ResNet152的第一层。

第三,如果我试图调用my_model.forward(),pytorch会抱怨大小不匹配。它需要大小[1,3,224224,224],但输入是[1,1000]。因此,看起来整个模型(减去fc层)的副本被附加到原始模型中。

总之,我找到的唯一答案实际上是行不通的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch中resnet_如何从PyTorch中的ResNet模型中删除最后一个FC层? 的相关文章

随机推荐