Рассмотрим следующий код, который будет печатать модули модели 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)