原本想直接跳过VGG,直接到PSEnet,但面试遇到很多使用VGG16的,于是静下心看看VGG网络到底是什么样的。
1 卷积核
又叫滤波器filter,在pytorch 卷积神经网络笔记,我已经写出了卷积计算的公式,但是卷积核的大小是多少呢?先看看卷积神经网络VGG16这么简单,为什么没人能说清? ,这里说卷积核一般用3*3.可是为什么呢?为什么倾向于使用3*3 小卷积核堆叠代替大卷积核
在实践中深度学习(05)–典型CNN结构(VGG13,16,19,3x3的卷积核在VGG16中应用的很好,后来才被ResNet等其他网络模型借鉴过去。
nn.Sequential
,我们知道FC曾主要做分类的,这里建立一个顺序执行的模型,pytorch系列7 -----nn.Sequential讲解,在这个容器中可以通过索引来获取,当然也可以取别名,参照pytorch教程之nn.Sequential类详解——使用Sequential类来自定义顺序连接模型self.classifier = nn.Sequential(
nn.Linear(512 * 7 * 7, 4096),
nn.ReLU(True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(True),
nn.Dropout(),
nn.Linear(4096, num_classes),
)
# 下面是打印出来的顺序模型,前面的数字就是模型中层
(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)
)
2.2 make_layers
在卷积层、池化层、RN层中在vgg的各个网络模型中有差异,于是将其中的参数提取出来,想用的时候只需要切换参数构建模型就很方便了。
cfg = {
'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}
def make_layers(cfg, batch_norm=False):
layers = []
in_channels = 3
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=1)
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)
def vgg13_bn(**kwargs):
model = VGG(make_layers(cfg['B'], batch_norm=True), **kwargs)
return model