VGG是ILSVRC2014分类任务的亚军,可以看成是加深版的AlexNet,都是由Conv layer + FC layer组成。
一. VGG的特点:
多个小尺寸的卷积核代替大尺寸卷积核
主要表现,使用2个3x3的卷积核替代5x5的卷积核
这样做的好处:
1.1 在保证相同的感受野的情况下,多个小的卷积层堆积可以提高网络 的深度,有利于提高特征提取能力。
1.2 参数量更少,一个5x5的卷积核,其参数量为5 x 5 x Channel_in x Channel_out,两个3x3的卷积核,其参数量为2 x 3 x 3 x Channel,很明显,25Channel_in x Channel_out > 18Channel_in x Channel_out。
1.3 3x3卷积核更有利于保持图像性质
二. VGG的网络结构:
三. 花品种分类代码实现
3.1 vgg模型框架搭建
import torch
import torch.nn as nn
class VGG(nn.Module):
def __init__(self, feature, num_classes=100, init_weights=False):
super(VGG, self).__init__()
self.features = feature
self.classifier = nn.Sequential(
nn.Linear(512*7*7, 4096),
nn.ReLU(True),
nn.Dropout(p=0.5),
nn.Linear(4096, 4096),
nn.ReLU(True),
nn.Dropout(p=0.5),
nn.Linear(4096, num_classes)
)
if init_weights:
self._initialize_weights()
def forward(self, x):
x = self.features(x)
x = torch.flatten(x, start_dim=1)
x = self.classifier(x)
return x
def _initialize_weights(self):
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.xavier_uniform_(m.weight)
if m.bias is not None:
nn.init.constant_(m.bias, 0)
elif isinstance(m, nn.Linear):
nn.init.xavier_uniform_(m.weight)
nn.init.constant_(m.bias, 0)
cfgs = {
'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