VggNet:《Very Deep Convolutional Networks for Large-Scale Image Recognition》,大规模图像识别的深度卷积网络。
首先,读一篇论文,我们第一遍通常需要泛读,即读这篇论文的题目,摘要,各个部分的标题和小标题,以及图片和表格。
下面是泛读之后整理出该篇论文大致分成5个部分。
VGGNet 这篇论文的主要贡献就是在于从网络深度这一角度出发,对卷积神经网络进行了改进。非常详细的评估了网络深度所带来的影响,证明了网络的深度对于性能的提升具有举足轻重的作用。而且由于文中训练的两个16层和19层的网络由于其强大的泛化能力,在之后得到了非常广泛的应用。
VGGNet 主要特点:
- 网络很深
- 卷积层中使用的卷积核很小,且都是3*3的卷积核
VGGNet 在2014年的 ImageNet Challenge 中获得了分类任务的第二名和定位任务的第一名。而且在分类任务中,只和获得冠军的 GoogLeNet 只相差了 0.1%,而且在单个网络中,VGG 是表现最好的,误差是 7.0%,比 GoogLeNet 的 7.9% 高了 0.9 个百分点。
我们可以将摘要总结如下:
从小标题的个数可以看出,第4部分的子标题最多,我们应该重点关注,其次应该关注第2、3部分。
当我们正式进入某一部分时,我们可以先看一下,该部分有没有 Overall、Conclusion、Discussion等等。或许我们先从该部分入手,先了解到该部分的大体内容,再返回去看具体的实现细节。
那么我们先从网络的架构(Configurations)入手,从上面的小标题可以看出,我们可以先从 2.3 小节入手。
可以从上面一段文字总结如下:
可以从上面一段文字总结如下: 使用 1*1 的卷积可以在不影响卷积层的结果的情况下增加决策函数的非线性。
可以从上面一段文字总结如下: 这次比赛的冠军 GoogLeNet 也使用了非常深的网络(22层)和小的卷积核(11,33,5*5)。它们使用为了减少计算量,设计更为复杂,更积极地减少了第一层的特征图的空间分布。但是从单个网络的分类准确率来看,VGGNet 的表现要优于 GoogLeNet。
接下来,我们再来看 2.3 小节中的图。
在实验中,一共尝试了上面六种模型(每一列是一种模型),模型中都使用了是 3x3 的卷积核大小,在模型 C 中尝试了 1x1 的卷积核,模型的深度从左向右依次增加。为了简洁方便,表格中只展示了卷积操作和池化操作,没有显示激活函数(在每个卷积层和全连接层后都有激活函数)。而且我们发现每层的通道数很小,第一层的通道数只有64,之后每进行一次最大池化,通道数变为之前的2倍,直到增加到512为止。
图中符号表示:
关于Table 2 的描述,在 2.2 小节中,我们来看看 2.2 小节。
Table 2 展示了上面六种模型中的参数个数,从 Table 1 中,我们知道模型的深度是从11层增加到了19层,尽管深度很深,但是网络的权重的数量是不大于一个更浅更宽的网络的。
最后我们在来看看整体网络的架构(2.1)。
从上面几段话,可以总结如下:
下面我们接着看第3节,该节主要描述的是网络中训练和评估的细节。我们先从 3.1 的 Training 开始。
以上几段主要介绍了在训练过程中参数的设置以及初始化,以及扩充数据集的方法。总结如下:
batch_size = 256
momentum = 0.9
L 2 L_2 L2 正则项: 5 ⋅ 1 0 − 4 5·10^{-4} 5⋅10−4
dropout:p = 0.5
learning rate:0.01(当验证集准确度不变时,learning rate 变为原来的 1/10)
随机初始化权重,然后用模型 A 进行训练,然后将优化后得到的权重作为更深层的网络的前4层卷积层和最后3个全连接层的初始化权重,并且这些层的学习率不进行衰减。其余层进行进行随机初始化,权重初始化为均值为0,方差为0.01的正态分布,偏差为0。
但是他们在论文提交之后发现,可以不用上面的方法初始化权重,直接使用 Glorot & Bengio(2010) 的随机初始化程序就能得到很好的效果。下面是 Glorot & Bengio 的初始化方法。
他们使用随即裁剪的方式将输入的图片大小固定在 224x224。为了扩充数据集,采用随机水平翻转和随机RGB颜色扰动
下面是对于训练图片大小的设置。
上面采取了两种方法来设置训练图片的大小 S。
总结如下:
举个栗子:假设输入的图片大小为 224x224x3,那么最后一个卷积层的输出为 7x7x512。那么如果输入图片大小为 448x448x3,那么最后一个卷积层的输出为 14x14x512。这样两个不同的尺度就不能连接同一个全连接层,所以需要对最后一个卷积层的输出做一个规定大小。那么只需要对他们做一个均值(最大)池化操作,7x7x512 池化之后就是 512,14x14x512 池化之后也是 512,这样就能与全连接层相连接了。
总结:
网络进行训练和评价以及训练和评估全尺寸多尺度图像都是使用一个系统上的多个 GPU 。多 GPU 训练利用数据并行性,将每批训练图像分割成若干 GPU 批次,在每个GPU上并行处理。计算完 GPU 批处理梯度后,取其平均值,得到整个批处理的梯度。梯度计算是同步的跨 GPU,因此结果和单一 GPU 训练是完全相同的。
网络在4个 NVIDIA Titan Black GPUs 训练单个网络花费了 2-3 周。
在第4节中,主要呈现了在 ILSVRC-2012 数据集上的分类结果,分类表现主要有两种评价指标:top-1 and top-5 errro,top-5 error 是 ILSVRC 的主要评价指标。
单尺度评估。首先我们来看看4.1小节给出的表格。
对于模型 A,A-LRN,B,它们都采用的是固定 S = 256,并且我们发现模型 A-LRN 的表现还没有模型 A 好,所以对于后面的模型,都没有使用 LRN(局部响应正则化),但是我们观察到从模型 A 到模型 B,随着深度的增加,top-1 和 top-5 error 也在下降。
再来观察模型 C、D、E,它们的 train 都测试了3种图片尺度,分别是 S=256,S=384,S=[256;512]。我们只看三个模型的 S=256 和 S=384,我们很容易发现不管哪一种模型,当 S=384,其模型的 top-1 和 top-5 是要优于 S=256 的。那是因为图片的分辨率越高,我们能够更容易捕捉到一些空间特征,所以其分类准确度就越高。
最后,我们再来看看的三种模型的 S=[256;512] 的这种情况,我们很容易发现这种情况的分类结果不管在哪一种模型中都是表现最好的。这也证明了通过尺度来扩充训练集确实有助于捕获多尺度图像统计。
多尺度评估。主要评估在测试阶段尺度抖动对分类准确度影响。当用固定图片大小S进行训练得到的模型,会用一张测试图片的三种尺寸大小进行评估,那么三种图片大小分别为:S-32,S,S+32。当训练时不是使用的固定 S 进行训练,S 是一个变量,属于 [ S m i n S_{min} Smin, S m a x S_{max} Smax],那么我们在评估时,测试图片的大小分别是: S m i n S_{min} Smin, 0.5 ( S m i n + S m a x ) 0.5(S_{min} + S_{max}) 0.5(Smin+Smax), S m a x S_{max} Smax。
评估结果如下:
根据表格我们可以得出结论:在测试阶段的尺度抖动相较于单尺度的相同模型会有更好的表现。其中模型 D 和 E 表现最好。表现最好的单个网络在验证数据集上 top-1 和 top-5 error 达到了 24.8%/7.5%,在测试数据集上,模型 E 达到了 7.3 % 的 top-5 error。
多裁剪评估。这里主要用到两种评估方法,一种是 dense,即评估时所使用的图片是整张图片,不经过任何裁剪。那么另一种就是 multi-crop,就是评估时使用的是裁剪后的图片。评估结果如下表:
从评估结果来看,使用 multi-crop 要比使用 dense 的表现稍微好一些,而且两种方法结合使用的表现比单独使用任何一种方法的效果都要好,因为两种方法是互补的。
模型融合。通过融合几种模型,最后取各个模型的 soft-max 结果的平均值作为模型的输出。下面是融合不同模型得到的实验结果。
可以从实验结果发现,融合一个模型 D 和模型 E ,并且在评估时使用 multi-crop 和 dense 的方法得到的表现最好。
主要是和 ILSVRC 比赛中表现比较好的模型进行比较,下表是在挑战赛中表现比较好的模型。
在 2014 年的挑战赛中,GoogLeNet 以 6.7% 的 error 夺冠,VGGNet 以 6.8% 的 error 获得第二名。但是如果从一个网络的分类准确度来看,VGG 是以 7.0% 的 error 要优于 GoogLeNet 的 7.9%。
在研究完每篇论文之后,我们都需要做一个总结。
那么我们先来看一下这篇论文的总结是什么?
再次强调了深度确实能够增加分类准确度。
下面就来进行自我总结。
创新点
启发点
复现代码见 VGGNet