| | '''VGG11/13/16/19 in Pytorch.''' |
| | import torch |
| | import torch.nn as nn |
| |
|
| |
|
| | cfg = { |
| | 'VGG11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], |
| | 'VGG13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], |
| | 'VGG16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'], |
| | 'VGG19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], |
| | } |
| |
|
| |
|
| | class VGG(nn.Module): |
| | def __init__(self, vgg_name): |
| | super(VGG, self).__init__() |
| | self.features = self._make_layers(cfg[vgg_name]) |
| | self.classifier = nn.Linear(512, 10) |
| |
|
| | def forward(self, x): |
| | out = self.features(x) |
| | out = out.view(out.size(0), -1) |
| | out = self.classifier(out) |
| | return out |
| |
|
| | def _make_layers(self, cfg): |
| | layers = [] |
| | in_channels = 3 |
| | for x in cfg: |
| | if x == 'M': |
| | layers += [nn.MaxPool2d(kernel_size=2, stride=2)] |
| | else: |
| | layers += [nn.Conv2d(in_channels, x, kernel_size=3, padding=1), |
| | nn.BatchNorm2d(x), |
| | nn.ReLU(inplace=True)] |
| | in_channels = x |
| | layers += [nn.AvgPool2d(kernel_size=1, stride=1)] |
| | return nn.Sequential(*layers) |
| |
|
| |
|
| | def test(): |
| | net = VGG('VGG11') |
| | x = torch.randn(2,3,32,32) |
| | y = net(x) |
| | print(y.size()) |
| |
|
| | |
| |
|