|
import torch.nn as nn |
|
import torchvision.models as models |
|
|
|
""" VGG_16 Architecture |
|
VGG( |
|
(features): Sequential( |
|
(0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(1): ReLU(inplace=True) |
|
(2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(3): ReLU(inplace=True) |
|
(4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) |
|
(5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(6): ReLU(inplace=True) |
|
(7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(8): ReLU(inplace=True) |
|
(9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) |
|
(10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(11): ReLU(inplace=True) |
|
(12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(13): ReLU(inplace=True) |
|
(14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(15): ReLU(inplace=True) |
|
(16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) |
|
(17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(18): ReLU(inplace=True) |
|
(19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(20): ReLU(inplace=True) |
|
(21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(22): ReLU(inplace=True) |
|
(23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) |
|
(24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(25): ReLU(inplace=True) |
|
(26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(27): ReLU(inplace=True) |
|
(28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) |
|
(29): ReLU(inplace=True) |
|
(30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) |
|
) |
|
(avgpool): AdaptiveAvgPool2d(output_size=(7, 7)) |
|
(classifier): Sequential( |
|
(0): Linear(in_features=25088, out_features=4096, bias=True) |
|
(1): ReLU(inplace=True) |
|
(2): Dropout(p=0.5, inplace=False) |
|
(3): Linear(in_features=4096, out_features=4096, bias=True) |
|
(4): ReLU(inplace=True) |
|
(5): Dropout(p=0.5, inplace=False) |
|
(6): Linear(in_features=4096, out_features=1000, bias=True) |
|
) |
|
) |
|
""" |
|
|
|
class VGG_16(nn.Module): |
|
def __init__(self): |
|
super(VGG_16, self).__init__() |
|
self.model = models.vgg16(weights=models.VGG16_Weights.IMAGENET1K_V1).features[:30] |
|
|
|
for i, _ in enumerate(self.model): |
|
if i in [4, 9, 16, 23]: |
|
self.model[i] = nn.AvgPool2d(kernel_size=2, stride=2, padding=0) |
|
|
|
def forward(self, x): |
|
features = [] |
|
for i, layer in enumerate(self.model): |
|
x = layer(x) |
|
if i in [0, 5, 10, 17, 24]: |
|
features.append(x) |
|
return features |
|
|
|
|
|
if __name__ == '__main__': |
|
model = VGG_16() |
|
print(model) |