from torch import nn from typing import Union, List, List vgg_urls = { "vgg11": "https://download.pytorch.org/models/vgg11-8a719046.pth", "vgg11_bn": "https://download.pytorch.org/models/vgg11_bn-6002323d.pth", "vgg13": "https://download.pytorch.org/models/vgg13-19584684.pth", "vgg13_bn": "https://download.pytorch.org/models/vgg13_bn-abd245e5.pth", "vgg16": "https://download.pytorch.org/models/vgg16-397923af.pth", "vgg16_bn": "https://download.pytorch.org/models/vgg16_bn-6c64b313.pth", "vgg19": "https://download.pytorch.org/models/vgg19-dcbb9e9d.pth", "vgg19_bn": "https://download.pytorch.org/models/vgg19_bn-c79401a0.pth", } vgg_cfgs = { "A": [64, "M", 128, "M", 256, 256, "M", 512, 512, "M", 512, 512], "B": [64, 64, "M", 128, 128, "M", 256, 256, "M", 512, 512, "M", 512, 512], "D": [64, 64, "M", 128, 128, "M", 256, 256, 256, "M", 512, 512, 512, "M", 512, 512, 512], "E": [64, 64, "M", 128, 128, "M", 256, 256, 256, 256, "M", 512, 512, 512, 512, "M", 512, 512, 512, 512] } def make_vgg_layers(cfg: List[Union[str, int]], in_channels: int = 3, batch_norm: bool = False, dilation: int = 1) -> nn.Sequential: layers = [] for v in cfg: if v == "M": layers += [nn.MaxPool2d(kernel_size=2, stride=2)] else: conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=dilation, dilation=dilation) if batch_norm: layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)] else: layers += [conv2d, nn.ReLU(inplace=True)] in_channels = v return nn.Sequential(*layers)