- Simonyan, Karen, and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014). pdf (VGGNet,Neural Networks become very deep!)
- VGGNet,牛津大学计算机视觉组(Visual Geometry Group)和Google DeepMind公司一起研发,深度卷积神经网络。VGGNet反复堆叠3x3小型卷积核和2x2最大池化层,成功构筑16~19层深卷积神经网络。比state-of-the-art网络结构,错误率幅下降,取得ILSVRC 2014比赛分类第2名和定位第1名。拓展性强,迁移其他图片数据泛化性好。结构简洁,整个网络都用同样大小卷积核尺寸和最大池化尺寸。VGGNet训练后模型参数官方开源,domain specific图像分类任务再训练,提供较好初始化权重。
- 网络结构
VGGNet 5段卷积,每段2~3卷积层,每段后接最大池化层给缩小图片尺寸。每段卷积核数量一样,越后段卷积核数量越多,64-128-256-512-512。多个3x3卷积层堆叠。2个3x3卷积层串联相当1个5x5。3个3x3卷积层串联相当1个7x7。 参数更少,非线性变换更多,增强特征学习能力。
先训练级别A简单网络,再复用A网络权重初如化复杂模型,训练收敛速度更快。预测,Multi-Scale,图像scale尺寸Q,图片输入卷积网络计算。最后卷积层,滑窗分类预测,不同窗口分类结果平均,不同尺寸Q结果平均得最后结果,提高图片数据利用率,提升预测准确率。训练过程,用Multi-Scale数据增强,原始图像缩放不同尺寸S,随机裁切224x224图片,增加数据量,防止过拟合。
LRN层作用不大,越深网络效果越好,1x1卷积很有效,但大卷积核可以学习更大空间特征。
VGGNet-16网络结构,6个部分,前5段卷积网络,最后一段全连接网络。定义创建VGGNet网络结构函数inference_op。输入input_op、keep_prob(控制dropout比率,placeholder)。先初始化参数列表p。
创建第一段卷积网络,两个卷积层(conv_op),一个最大池化层(mpool_op)。卷积核大小3x3,卷积核数量(输出通道数) 64,步长1x1,全像素扫描。第一卷积层输入input_op尺寸224x224x3,输出尺寸224x224x64。第二卷积层输入输出尺寸224x224x64。最大池化层2x2,输出112x112x64。
第二段卷积网络,2个卷积层,1个最大池化层。卷积输出通道数128。输出尺寸56x56x128。
第三段卷积网络,3个卷积层,1个最大池化层。卷积输出通道数256。输出尺寸28x28x256。
第四段卷积网络,3个卷积层,1个最大池化层。卷积输出通道数512。输出尺寸14x14x512。
第五段卷积网络,3个卷积层,1个最大池化层。卷积输出通道数512。输出尺寸7x7x512。输出结果每个样本,tf.reshape 扁平化为长度7x7x512=25088一维向量。
连接4096隐含点全连接层,激活函数ReLU。连接Dropout层,训练节点保留率0.5,预测1.0。
全连接层,Dropout层。
最后连接1000隐含点全连接层,Softmax 分类输出概率。tf.argmax 输出概率最大类别。返回fc8、softmax、predictions、参数列表p。
VGGNet-16网络结构构建完成。
理解网络
-
通过逐步增加网络深度来提高性能,虽然看起来有一点小暴力,没有特别多取巧的,但是确实有效,很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相对其他的方法,参数空间很大,最终的model有500多m,alnext只有200m,googlenet更少,所以train一个vgg模型通常要花费更长的时间,所幸有公开的pretrained model让我们很方便的使用,前面neural style文章里面就使用的pretrained的model.
-
减少参数的措施,对于一组(假定3个,paper里面只stack of three 33)卷积相对于77在使用3层的非线性关系(3层RELU)的同时保证参数数量为3(32C2)=27C2的,而7*7为49C2,参数约为77的81%。
-
去掉了LRN,减少了内存的小消耗和计算时间
-
虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的 VGGNet-16 和 VGGNet-19。C相比B多了几个1´1的卷积层,1´1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。
-
采用 Pre-trained 方法利用浅层网络(A)训练参数初始化深层网络参数(D,E),加速收敛;采用 Multi-Scale 方法进行数据增强、训练、测试,提高准确率;去掉了 LRN,减少了内存的小消耗和计算时间。
-
虽然 VGGNet 减少了卷积层参数,但实际上其参数空间比 AlexNet 大,其中绝大多数的参数都是来自于第一个全连接层,耗费更多计算资源。在随后的 NIN 中发现将这些全连接层替换为全局平均池化,对于性能影响不大,同时显著降低了参数数量。
-
采用 Pre-trained 方法训练的 VGG model(主要是 D 和 E),相对其他的方法参数空间很大,所以训练一个 VGG 模型通常要花费更长的时间,所幸有公开的 Pre-trained model 让我们很方便的使用。
两个连续的3*3的卷积相当于5*5的感受野,三个相当于7*7。使用三个3*3卷积而不是一个7*7的卷积的优势有两点:一,包含三个ReLu层而不是一个,使决策函数更有判别性;二,减少了参数。比如输入输出都是C个通道,使用3*3的3个卷积层需要3(3*3*C*C)=27*C*C,使用7*7的1个卷积层需要7*7*C*C=49C*C。这可看为是对7*7卷积施加一种正则化,使它分解为3个3*3的卷积。
1*1卷积层主要是为了增加决策函数的非线性,而不影响卷积层的感受野。虽然1*1的卷积操作是线性的,但是ReLu增加了非线性。
与他人工作对比:Ciresan et al.(2011)也曾用过小的卷积,但是他的网络没有VGGNet深,而且没有在大规模的ILSVRC数据集上测试。Goodfellow使用深的卷积网络(11层)做街道数字识别,表明增加卷及网络深度可以提高性能。GoogLeNet(ILSVRC-2014分类任务冠军)与VGGNet独立发展起来,同样的是也使用了很深的卷积网络(22层)和小的卷积(5*5,3*3,1*1)。
- 训练
优化方法(optimizer)是含有动量的随机梯度下降SGD+momentum(0.9)。
批尺寸(batch size)是256.
正则化(regularization):采用L2正则化,weight decay是5e-4。dropout在前两个全连接层后,p=0.5。
尽管相比于AlexNet网络更深,参数更多,但是我们推测VGGNet在更少的周期内就能收敛,原因有二:一,更大的深度和更小的卷积带来隐式的正则化;二,一些层的预训练。
参数初始化:对于较浅的A网络,参数进行随机初始化,权重w从N(0,0.01)中采样,偏差bias初始化为0。然后,对于较深的网络,先用A网络的参数初始化前四个卷积层和三个全连接层。但是后来发现,不用预训练的参数而直接随机初始化也可以。
为了获得224*224的输入图像,要在每个sgd迭代中对每张重新缩放(rescale)的图像随机裁剪。为了增强数据集,裁剪的图像还要随机水平翻转和RGB色彩偏移。
- 测试
测试阶段步骤:
1,对输入图像各向同性地重缩放到一个预定义的最小图像边的尺寸Q;
2. 网络密集地应用在重缩放后的测试图像上。也就是说全连接层转化为卷积层(第一个全连接层转化为7*7的卷积层,后两个全连接层转化为1*1的卷积层) ,然后将转化后的全连接层应用在整张图像上。结果就是一个类别分数图(class score map),其通道数等于类别数量,依赖于图像尺寸,具有不同的空间分辨率。
3. 为了获得固定尺寸的类别分数向量(class score vector),对class score map进行空间平均化处理(sum-pooled)。
- tflearn_example
- TFLearn 支持不同的 optimizer; TFlearn 下还支持 vgg_network_finetuning.py,利用已经训练的 model 在自己的 dataset 上 finetune。