Используйте только определенные слои предварительно обученной сети Torchvision - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь использовать только определенные слои в сети Faster-RCNN с предварительным обучением факелу, инициализированной:

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()

Это работает. Однако передача model.modules() или model.children() в nn.Sequential приводит к ошибке. Даже прохождение всей модели приводит к ошибкам, например,

model = torch.nn.Sequential(*model.modules())
model.eval()
# x is a [C, H, W] image
y = model(x)

ведет к

AttributeError: 'dict' object has no attribute 'dim'

и

model = torch.nn.Sequential(*model.children())
model.eval()
# x is a [C, H, W] image
y = model(x)

ведет к

TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not tuple

Это смущает меня, потому что я модифицировал другие предварительно обученные модели PyTorch, как это в прошлом. Как я могу использовать предварительно подготовленную модель FasterRCNN для создания новой (предварительно обученной) модели, которая использует только определенные слои, например, все слои, кроме последнего?

1 Ответ

2 голосов
/ 05 июня 2019

В отличие от других простых моделей CNN, нетрудно преобразовать детектор на основе R-CNN в простую модель nn.Sequential.Если вы посмотрите на функциональность R-CNN ('generalized_rcnn.py'), то увидите, что выходные функции (вычисленные магистралью FCN) не просто передаются в компонент RPN, а скорее объединяются свходное изображение и даже с целями (во время обучения).

Поэтому, я полагаю, если вы хотите изменить способ поведения R-CNN, вам придется использовать базовый класс torchvision.models.detection.FasterRCNN() и предоставьте ему различные параметры пула.

...