I have a model that is a concatination of pretraind vgg16 and a similar one with different kernel size. Is there a way to transfer the weights of the pretrained network to the other one so that network 2 don’t start training from 0? I want to use this network as feature extraction in transfer learning
This is the structure of the whole network:
Model Structure:
class Detector(nn.Module):
def __init__(self):
super(Detector, self).__init__()
Pretrained VGG16: Kernel Size = 3*3
self.base = torchvision.models.vgg16(pretrained=True).features
New Network: Kernel Size = 5*5
self.conv_1a = nn.Conv2d(3, 64, kernel_size=5, stride=1, padding=1)
self.conv_1b = nn.Conv2d(64, 64, kernel_size=5, stride=1, padding=1)
self.conv_2a = nn.Conv2d(64, 128, kernel_size=5, stride=1, padding=1)
self.conv_2b = nn.Conv2d(128, 128, kernel_size=5, stride=1, padding=1)
self.conv_2c = nn.Conv2d(128, 128, kernel_size=5, stride=1, padding=1)
self.conv_3a = nn.Conv2d(128, 256, kernel_size=5, stride=1, padding=1)
self.conv_3b = nn.Conv2d(256, 256, kernel_size=5, stride=1, padding=1)
self.conv_3c = nn.Conv2d(256, 256, kernel_size=5, stride=1, padding=1)
self.conv_3d = nn.Conv2d(256, 256, kernel_size=5, stride=1, padding=1)
self.conv_4a = nn.Conv2d(256, 512, kernel_size=5, stride=1, padding=1)
self.conv_4b = nn.Conv2d(512, 512, kernel_size=5, stride=1, padding=1)
self.conv_4c = nn.Conv2d(512, 512, kernel_size=5, stride=1, padding=1)
self.conv_4d = nn.Conv2d(512, 512, kernel_size=5, stride=1, padding=1)
Merging Feature maps
self.featuremap = nn.Conv2d(1024, 512, kernel_size=1, stride=1, padding=0)
def forward(self, image_tensor: Tensor) -> Tensor:
k3 = image_tensor
k5 = image_tensor
kernel 3*3:
for layer in self.base:
k3 = layer(k3)
kernel 5*5:
k5 = F.relu(self.conv_1a(k5))
k5 = F.relu(self.conv_1b(k5))
k5 = F.max_pool2d(k5, kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
k5 = F.relu(self.conv_2a(k5))
k5 = F.relu(self.conv_2b(k5))
k5 = F.relu(self.conv_2c(k5))
k5 = F.max_pool2d(k5, kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
k5 = F.relu(self.conv_3a(k5))
k5 = F.relu(self.conv_3b(k5))
k5 = F.relu(self.conv_3c(k5))
k5 = F.relu(self.conv_3d(k5))
k5 = F.max_pool2d(k5, kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
k5 = F.relu(self.conv_4a(k5))
k5 = F.relu(self.conv_4b(k5))
k5 = F.relu(self.conv_4c(k5))
k5 = F.relu(self.conv_4d(k5))
k5 = F.max_pool2d(k5, kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
Concat the 2 Networks:
conc_featuremap = torch.cat((k3, k5),dim=1)
Merge Concatinated Feature
featuremap = self.featuremap(conc_featuremap)
return featuremap