源码地址 https://github.com/stephen-v/tensorflow_vgg_classify
1. VGG介绍 1.1. VGG模型结构
VGG网络是牛津大学Visual Geometry Group团队研发搭建,该项目的主要目的是证明增加网络深度能够在一定程度上提高网络的精度。VGG有5种模型,A-E,其中的E模型VGG19是参加ILSVRC 2014挑战赛使用的模型,并获得了ILSVRC定位第一名,和分类第二名的成绩。整个过程证明,通过把网络深度增加到16-19层确实能够提高网络性能。VGG网络跟之前学习的LeNet网络和AlexNet网络有很多相似之处,以下搭建的VGG19模型也像上一次搭建的AlexNet一样,分成了5个大的卷积层,和3个大的全链层,不同的是,VGG的5个卷积层层数相应增加了;同时,为了减少网络训练参数的数量,整个卷积网络均使用3X3大小的卷积。
首先来看看原论文中VGG网络的5种模型结构。A-E模型均是由5个stage和3个全链层和一个softmax分类层组成,其中每个stege有一个max-pooling层和多个卷积层。每层的卷积核个数从首阶段的64个开始,每个阶段增长一倍,直到达到512个。
A:是最基本的模型,8个卷基层,3个全连接层,一共11层。
A-LRN:忽略
B:在A的基础上,在stage1和stage2基础上分别增加了1层3X3卷积层,一共13层。
C:在B的基础上,在stage3,stage4和stage5基础上分别增加了一层1X1的卷积层,一共16层。
D:在B的基础上,在stage3,stage4和stage5基础上分别增加了一层3X3的卷积层,一共16层。
E:在D的基础上,在stage3,stage4和stage5基础上分别增加了一层3X3的卷积层,一共19层。
模型D是就是经常说的VGG16网络,模型E则为VGG19网络。
虽然VGG网络使用的均是3X3的卷积filter,极大的减小了参数个数,但和AlexNet比较起来,参数个数还是相当的多,以模型D为例,每一层的参数个数如下表所示,总参数个数为1.3亿左右,庞大的参数增加了训练的时间,下一章单搭建的VGG19模型仅在CPU上进行训练,单单一个epoch就要训练8小时以上!
尽管VGG19有那么多的参数,但是在训练过程中,作者发现VGG需要很少的迭代次数就开始收敛了,这是因为:
1、深度和小的filter尺寸起到了隐式的规则化作用
2、一些层的pre-initialisation
怎么做pre-initialisation呢?作者先训练最浅的网络A,然后把A的前4个卷积层和最后全链层的权值当作其他网络的初始值,未赋值的中间层通过随机初始化进行训练。这样避免了不好的权值初始值对于网络训练的影响,从而加快了收敛。
为什么在整个VGG网络中都用的是3X3大小的filter呢,VGG团队给出了下面的解释:
1、3 * 3是最小的能够捕获上下左右和中心概念的尺寸。
2、两个3 * 3的卷基层的有限感受野是5X5;三个3X3的感受野是7X7,可以替代大的filter尺寸。(感受野表示网络内部的不同位置的神经元对原图像的感受范围大小,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;而值越小则表示其所包含的特征越趋向于局部和细节。)
3、多个3 * 3的卷基层比一个大尺寸filter卷基层有更多的非线性,使得判决函数更加具有判决性。
4、多个3 * 3的卷积层比一个大尺寸的filter有更少的参数,假设卷基层的输入和输出的特征图大小相同为C,那么三个3 * 3的卷积层参数个数为\(3(3^2C^2)=27C^2\);一个7 * 7的卷积层参数为\(49C^2\),整整比3 * 3的多了81%。
1.2. VGG19架构首先来看看论文中描述的VGG19的网络结构图,输入是一张224X224大小的RGB图片,在输入图片之前,仍然要对图片的每一个像素进行RGB数据的转换和提取。然后使用3X3大小的卷积核进行卷积,作者在论文中描述了使用3X3filter的意图:
“we use filters with a very small receptive field: 3 × 3 (which is the smallest size to capture the notion of left/right, up/down, center).”
即上面提到的“3X3是最小的能够捕获上下左右和中心概念的尺寸”。接着图片依次经过5个Stage和3层全连层的处理,一直到softmax输出分类。卷积核深度从64一直增长到512,更好的提取了图片的特征向量。
Stage1:
包含两个卷积层,一个池化层,每个卷积层和池化层的信息如下:
3 * 3 64 1 * 1