Как удалить последний слой FC из модели ResNet в PyTorch?Python

Программы на Python
Anonymous
Как удалить последний слой FC из модели ResNet в PyTorch?

Сообщение Anonymous »

Я использую модель ResNet152 из PyTorch. Я хотел бы удалить последний слой 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 из модели.

Я нашел ответ здесь, на SO ( Как преобразовать предварительно обученные слои FC в слои CONV в Pytorch), где mexmex, кажется, дает ответ, который я ищу:

Код: Выделить всё

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, 224, 224], но входные данные были [1, 1000]. Похоже, что копия всей модели (за исключением слоя fc) добавляется к исходной модели.

Итог: единственный ответ, который я нашел на SO, не на самом деле это не работает.

Подробнее здесь: https://stackoverflow.com/questions/525 ... in-pytorch

Вернуться в «Python»