前言
VGG参加2014年的ImageNet图像分类与定位挑战赛,取得了分类第二,定位第一的优秀成绩;
结构
VGG根据卷积核大小和卷积层数目不同,可以分为A,A-,LRN,B,C,D,E 6种,以D,E两种较为常用,分别称为VGG16和VGG19;
下图给出VGG的六种结构配置:
上图中,每一列对应一种结构配置,比如:图中的绿色部分即指明了VGG16所采用的结构;
针对其进行具体分析,可以看到VGG16共包含:
- 13个卷积层(Convolutional Layer),分别用conv3-xxx表示
- 3个全连接层(Fully connected Layer),分别用FC-XXXX表示
- 5个池化层(Pool Layer),用maxpool表示
其中,因为卷积层和全连接层都具有权重系数,因此也被称为权重层,可以得到13+3=16。[池化层不涉及权重]
特点
VGG16的突出特点为简单,体现在:
- 卷积层使用相同的卷积核参数。卷积层均表示为conv3-xxx,其中conv3表示卷积层采用的卷积核kernel size为3,3*3是很小的卷积核尺寸,结合其他参数(步幅stride=1,填充方式padding=same),就能保持每一个卷积层(张量)与前一层(张量)保持相同的宽和高,XXX代表卷积层的通道数。
- 池化层采用相同的池化核参数。池化层的参数均为2*2,步幅stride=2,max的池化方式,这样就能够使得每一个池化层(张量)的宽和高是前一层(张量)的????。
- 模型是由若干卷积层和池化层堆叠(stack)的方式构成,比较容易构成较深的网络结构;
块的结构
第一张图片的右侧,VGG16的卷积层和池化层可以分成不同的Block,从上到下依次编号为Block1~block5;每一个块内包含若干卷积层和一个池化层;并且同一Block内,卷积层的通道(channel)数是相同的,例如:
- block2中包含2个卷积层,每个卷积层用convv3-128表示;即卷积核为3*3*3,通道数为128;
下图为按照块划分的VGG16结构图,可以结合第二张图进行理解:
VGG的输入图像是244*244*3的图像张量,随着层数的增加,后一块内的张量相比于前一个块内的张量:
- 通道数翻倍,从64--128--256--512(保持)
- 高和宽变减半,由224--112--56--28--14--7
权重参数
VGG的结构虽然简单,但是所含的权重数目很大,达到惊人的139,357,544个参数,这些参数包括卷积核权重,全连接层权重。
- 例如:第一层卷积,输入图的通道数是3,网络必须学习大小为3*3,通道数为3的卷积核,这样的卷积核有64个,因此总共有(3*3*3)*64=1728个参数
- 计算全连接层的权重参数数目的方法为:前一层节点数*本层的节点数;因此全连接层的参数分别为:
7*7*512*4096;4096*4096;4096*1000;
FeiFei Li在CS231的课件中给出了整个网络的全部参数的计算过程(不考虑偏置),如下图所示:
图中蓝色是计算权重参数数量的部分;红色是计算所需存储容量的部分;
VGG16具有如此之大的参数数目,可以预期他具备很高的拟合能力;但同时具备了缺点:训练时间过长,需要的存储容量大;
实践
通过不断地卷积、池化来提取特征,通过全连接层以及softmax函数可以实现分类;根据结构来写代码,M代表最大池化,base里面定义了每一层通道数;
def vgg(cfg, i, batch_norm=False):
layers = []
in_ch