Соединение пользовательских слоев с предварительно подготовленными моделями Pytorch - PullRequest
0 голосов
/ 28 января 2020

Рассмотрим следующий код, который будет печатать модули модели fast_rcnn с магистралью resnet50 в PyTorch.

model_fastercnn = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) 
modules_2 = list(model_fastercnn.children())
for iter, module in enumerate(modules_2):
    print("###### {} ######".format(iter))
    print(module) 

Вот последний модуль, который печатался с использованием предыдущего кода.

###### 3 ######
RoIHeads(
  (box_roi_pool): MultiScaleRoIAlign()
  (box_head): TwoMLPHead(
    (fc6): Linear(in_features=12544, out_features=1024, bias=True)
    (fc7): Linear(in_features=1024, out_features=1024, bias=True)
  )
  (box_predictor): FastRCNNPredictor(
    (cls_score): Linear(in_features=1024, out_features=91, bias=True)
    (bbox_pred): Linear(in_features=1024, out_features=364, bias=True)
  )
)

Теперь предположим, что мы хотим использовать вывод «fc7» (RoIHeads-> box_head-> fc7) в качестве ввода для других пользовательских слоев, например, одного Linear 1024 -> 512, также хотим использовать предварительно обученный вес до fc7 и просто тренируйте веса последнего добавленного слоя для некоторой функции потерь. Так как последний модуль обернут классом, есть ли способ сделать это?

Я привожу последнее предложение, поскольку, например, рассмотрим предварительно обученную модель resnet152 в PyTorch, печатая модули (как выше), я узнаю, что она содержит «9» слоев, а последний слой - F C (просто nn.Linear), я опускаю последний слой и строю другую Последовательную сеть, затем добавляю другой слой и обучаю модель, используя только параметры последнего слоя. для получения дополнительной информации см. код ниже, который взят из здесь :

class EncoderCNN(nn.Module):
    def __init__(self, embed_size):
        """Load the pretrained ResNet-152 and replace top fc layer."""
        super(EncoderCNN, self).__init__()
        resnet = models.resnet152(pretrained=True)
        modules = list(resnet.children())[:-1]      # delete the last fc layer.
        self.resnet = nn.Sequential(*modules)
        self.linear = nn.Linear(resnet.fc.in_features, embed_size)
        self.bn = nn.BatchNorm1d(embed_size, momentum=0.01)

    def forward(self, images):
        """Extract feature vectors from input images."""
        with torch.no_grad():
            features = self.resnet(images)
        features = features.reshape(features.size(0), -1)
...