Тонкая настройка Re snet с использованием предварительно запутанных функций - PullRequest
0 голосов
/ 10 апреля 2020

Поскольку мы знаем, что слои для свертки являются дорогостоящими в расчете, я хотел бы рассчитать выходные данные слоев для свертки один раз и использовать их для обучения полностью связанного слоя моего Re snet, чтобы ускорить процесс.

В случае модели VGG мы можем вычислить выход первой сверточной части следующим образом

x = model_vgg.features(inputs)

Но как я могу извлечь элементы из Re snet?

Заранее спасибо

1 Ответ

1 голос
/ 11 апреля 2020

Полагаю, вы можете попробовать взломать net. В качестве примера я буду использовать resnet18:

import torch
from torch import nn
from torchvision.models import resnet18

net = resnet18(pretrained=False)
print(net)

Вы увидите что-то вроде:

....
      (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)
    )
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
  (fc): Linear(in_features=512, out_features=1000, bias=True)

Давайте сохраним где-нибудь линейный слой и вместо него поместим фиктивный слой , Тогда вывод всего net на самом деле является выводом слоев конвона.

x = torch.randn(4,3,32,32) # dummy input of batch size 4 and 32x32 rgb images
out = net(x)
print(out.shape)
>>> 4, 1000 # batch size 4, 1000 default class predictions

store_fc = net.fc      # Save the actual Linear layer for later
net.fc = nn.Identity() # Add a layer which actually does nothing
out = net(x)
print(out.shape)
>>> 4, 512 # batch size 4, 512 features that are the input to the actual fc layer.
...