计算机视觉系列3 VGGNet网络理解

计算机视觉系列3 VGGNet网络理解

本文链接:https://blog.csdn.net/weixin_44633882/article/details/88382638

1. VGGNet网络简介

  VGGnet是一个从AlexNet发展而来的卷积神经网络,由Oxford的K. Simonyan和A. Zisserman在《Very Deep Convolutional Networks for Large-Scale Image Recognition》提出,网络的名字VGG也是来自于Oxford的(Visual Geometry Group)名称简写。
  该网络是在ILSVRC 2014上的相关工作,在ImageNet数据集上达到了92.7% top-5 test accuracy,取得了ILSVRC 2014比赛分类项目的第2名和定位项目的第1名。主要贡献是证明了增加网络的深度能够在一定程度上影响网络最终的性能,(ps: 虽然有点暴力,但还是合理的扩展,也确实有效果)。VGG有两种结构,分别是VGG16和VGG19,两者并没有本质上的区别,只是网络深度不一样。
顺便一提,ILSVRC 2014比赛中,GoogLeNet在分类项目上是第1名。

1.1 网络特点

  1. 网络更深,性能比之前的浅网络好。(可以看看网络A,B,C,D,E)
  2. 拿VGG16来说,结构简洁,整个网络全部使用了3×3的卷积核和2×2的池化核。
  3. 耗费更多计算资源,使用了更多参数,训练时间更长,其中绝大部分参数来自于第一个全连接层,(使用了三个全连接层)
  4. 去除LRN,减少了内存的消耗和计算时间。(作者通过对比网络A和A-LRN发现,LRN层无性能增益)
  5. 拓展性很强,迁移到其他图片数据上的泛化性非常好。VGGNet预训练模型在官网上已公布,如果你自己使用的数据集和VGG预训练的数据集相似,而且自己的数据集太小,这时可以考虑在VGG预训练模型基础上做fine-turning,和从头开始训练相比,省去大量计算资源和计算时间,因为预训练模型已提取浅层和深层特征了。

补充

1. 为什么采用连续的多个3×3的卷积核代替AlexNet中的较大卷积核(11×11, 7×7, 5×5)?

答:
  采用堆积的小卷积核是优于采用大的卷积核。 多层非线性层可以增加网络深度来保证学习更复杂的模式(更多relu,非线性能力更强),而且代价还比较小,参数少。
  在VGG中,使用3个3×3卷积核来代替7×7卷积核,使用2个3×3卷积核来代替5×5卷积核。在感知野相同的条件下,提升了网络的深度,在一定程度上提升了网络的效果。接下来使用两个例子来说明。

例1 3个3x3连续卷积相当于一个7x7卷积

  • C: 通道数(输入通道数和输出通道数相同)
  • 使用7x7卷积参数量: 7 × 7 × C 2 = 49 × C 2 7×7×C^2=49×C^2 7×7×C2=49×C2
  • 使用3个3x3连续卷积参数量: 3 × ( 3 × 3 × C 2 ) = 27 × C 2 3×(3×3×C^2) = 27×C^2 3×(3×3×C2)=27×C2
    可以看出,在感受野相同的情况下,多个小卷积的参数数量比一个大卷积的少了一半。

例2 2个3x3连续卷积相当于一个5x5卷积

计算机视觉系列3 VGGNet网络理解_第1张图片
2. 使用1×1的卷积层

  在下面的网络结构表中,网络C使用了1×1的卷积,主要作用是在不影响卷积层的感受野的前提下增加非线性变换,其中输入通道数和输出通道数不变,是在相同维度空间上的映射。有关1×1卷积可以了解一下Network in Network网络。

2. 网络结构

表中,从A->E,网络的深度随着更多层的加入,不断增加。
卷积层的参数表示为conv<卷积核大小>-<通道数>
计算机视觉系列3 VGGNet网络理解_第2张图片

2.1 参数数量

网络 A,A-LRN B C D E
网络的参数量 133 133 134 138 144

2.2 VGG-16网络结构

以VGG-16为例,了解其处理过程。
可以看出VGG网络比较简洁,都是由小卷积核、小池化核、ReLU组合而成。

层名 参数 输出
Input 224×224×3
Conv1: 2×Conv(ReLU) kernel:3×3×3, stride:1, filter:64 224×224×64
Max Pooling1 kernel:2×2, stride:2 112×112×64
Conv2: 2×Conv(ReLU) kernel:3×3×64, stride:1, filter:128 112×112×128
Max Pooling2 kernel:2×2, stride:2 56×56×128
Conv3: 3×Conv(ReLU) kernel:3×3×128, stride:1, filter:256 56×56×256
Max Pooling3 kernel:2×2, stride:2 28×28×256
Conv4: 3×Conv(ReLU) kernel:3×3×256, stride:1, filter:512 28×28×512
Max Pooling4 kernel:2×2, stride:2 14×14×512
Conv5: 3×Conv(ReLU) kernel:3×3×512, stride:1, filter:512 14×14×512
Max Pooling5 kernel:2×2, stride:2 7×7×512
FC1(ReLU) + Dropout 1×1×4096
FC2(ReLU) + Dropout 1×1×4096
FC3(ReLU) 1×1×1000
softmax 1×1×1000(类别)

VGG网络结构可视化
https://dgschwend.github.io/netscope/#/preset/vgg-16

3. 学习细节

3.1 训练

VGGNet训练的方式参考了AlexNet的方式,

预处理:为了获得固定尺寸224×224的输入图像,通过随机crop训练集中的经过变换的图片(每个SGD iteration中每个图片一个crop)。
数据预处理可以看我的博客 https://blog.csdn.net/weixin_44633882/article/details/87705734

数据增强:类似AlexNet数据增强的方法,对于图片的crop,随机进行水平翻转和RBG shift。

正则化方法:1) 通过weight decay来正则化(L2惩罚因子设置为5*10-4)2) 在前两个全连接层使用dropout(dropout=0.5)

优化算法:使用mini-batch sgd(momentum=0.9;batch size=256)

learning rate: 初始化为0.01,当验证集正确率不变时,学习率除以10来优化。(作者说他们的训练过程中,learning rate总共优化了3次,在370K iterations(74 epoches)时不再改变)

参数初始化
网络权重的初始化十分重要,因为不好的初始化会停止学习,因为深层网络的梯度不稳定。作者使用网络A开始训练(随机初始化对浅层网络有效果),**然后,对于训练更深的网络,我们用网络A的参数来对前四个卷积层和最后三个全连接层进行初始化。**不减小原先的学习率,使得他们能在学习时改变。weights初始化使用正态分布(mean:0;variance:10-2),biases使用0初始化。(其实Bengio在2012的论文中说,weights的初始化可以不用预先训练网络A,使用随机初始化是可以的,具体内容还得看paper)

补充

  1. 虽然相较于AlexNet,VGGNet参数数量多、网络深,但网络收敛需要的epoch迭代次数少于AlexNet,作者认为有两个原因,a) 更深的网络和更小的卷积产生了正则化 b) 用某些层来初始化。

  2. 图像裁剪方式
    S是训练集图片最小边的大小。若crop大小为224×224,那么S就不能小于224。(在预处理的代码中,也是这么设计的。)
    作者考虑了两种方法来规定训练图片的最短边大小S
    (1) single-scale training 固定最小边的大小S=256或384
    (2) multi-scale training S是随机从[256,512]范围中选择,这样图片尺寸不同,有利于增强训练集,提高识别精确率(尺度抖动 scal jittering)。

3.2 测试

  • 在测试时,训练图片最小边(Q)至少为224,可以和S不一样。
  • 直接将resize后的整张图片进行预测,而不是使用AlexNet中的multi-crop预测。
  • 参考了FCN
    将第一层全连接层变成(7×7×512×4096卷积核)的卷积层(原本需要先进行Flatten操作,再进行FC操作),第二个全连接层变成(1×1×4096×4096卷积核)的卷积层,第三个全连接层变成(1×1×4096×num_classes卷积核)的卷积层。 全卷积层网络的优点是不需要crop图像,图像分辨率可变。
    输出一个class score map,通道数等于类别数。
    对class score map每个通道求和得到图片的类别得分向量(1×1×num_classes)
  • 测试集也使用了水平翻转来实现数据增强,对属于一张图片的数据softmax输出做平均(在数据增强之后,一张图片对应多个数据),得到这张图片的最后得分。

4. 实验结果

  • 数据集:ILSVRC-2012 dataset
    数据集中包括了1000个类别的图片,分为训练集(1.3M images),验证集(50K images)和测试集(100K images)
  • 评估标准:top-1 error和top-5 error
    • top-1 error用于评估多类别分类错误率(即被分错的图片比例)
    • top-5 error是ILSVRC比赛中主要的评估标准(即所有预测的top-5类别错误的图片比例)

4.1 单尺度评估(Single Scale Evaluation)

测试集中的图片尺寸可设置为:1)固定的S 2) 在[Smin,Smax]范围尺度抖动得到的0.5(Smin+Smax),两种方式都进行了测试。

测试的思路:

  1. 在网络A的基础上添加了LRN层,但LRN没有改善网络A,又增加了计算量。所以作者在网络B-E中不使用LRN。

  2. 作者观察到,从网络A(11层)到网络E(19层),随着网络变深,分类错误率也随之减小。就如同网络C比网络B学习到更多非线性特征。
    虽然网络C和网络D深度相同,但一个3×3卷积提供的非线性变换比一个1×1卷积的更好,网络D效果更好。

  3. 当层数达到19层时,整个模型达到了饱和,错误率不再减小,如果有更大的数据集,更深的网络或许会有用。

  4. 在表3中可以看到,在训练时,使用了尺度抖动的数据输入,比固定最小尺寸的数据输入具有更好的效果。这一结果,表明通过尺度抖动使训练集数据增强,有利于捕获多尺度的图片信息。

计算机视觉系列3 VGGNet网络理解_第3张图片

4.2 多尺度评估(Multi Scale Evaluation)

在测试阶段使用尺度抖动技术,也就是说,在预测时一张图片,我们可以得到多个rescale的版本,对这多个版本的输出求平均得到类后验概率。

  • 训练时使用固定图片尺寸输入的网络,我们将测试图片设置为{S-32, S, S+32}三个值。
  • 训练时使用尺度抖动输入的网络,能够接受很广的尺度范围,所以将测试图片设置为(Smin, 0.5(Smin+Smax), Smax)
    从结果来看,测试时使用尺度抖动比4.1中的单尺度评估具有更好的表现力。

计算机视觉系列3 VGGNet网络理解_第4张图片

参考博客

  1. VGG in Tensorflow模型和代码 https://www.cs.toronto.edu/~frossard/post/vgg16/
  2. 一文读懂VGG网络 https://zhuanlan.zhihu.com/p/41423739
  3. http://blog.leanote.com/post/dataliu/5d29e67dd0b0

你可能感兴趣的:(#,深度学习)