VGGNet学习笔记

1 简介

      VGGNet 是牛津大学计算机视觉组等在 2014 年提出的深度卷积神经网络,该网络在 ILSVRC-2014 的定位和分类任务中分别获得了第一名和第二名。2012 年 AlexNet 的提出引爆了神经网络的应用热潮,随后有很多改进 AlexNet 的尝试,比如:2013 年的 ZFNet 在第一个卷积层使用更小的卷积核和更小的卷积步长、在整张图像和多个尺度上密集地训练和测试网络等,而 VGGNet 讨论了卷积网络架构设计的另一个重要方面——深度。VGGNet 的结构定义非常简洁,卷积层具有相同大小的卷积核,都为 3×3,并且 stride=1,采用 SAME padding;池化层的核大小为 2×2,并且 stride=2。由于使用了很小的卷积核,通过添加更多的卷积层来稳定地增加网络深度的方案变得可行。VGGNet 的拓展性很强,迁移到其它的数据集上也具有很好的泛化能力,另外,VGGNet 还可以被用做图像特征提取。

2 网络架构

      在训练阶段,VGGNet 网络输入的是大小为 224 × 224 的图像,作者对图像做了一个预处理:每个像素减去在训练集上计算的 RGB 均值。VGGNet 的所有卷积层使用了相同的 3 × 3 大小的卷积核 (这是捕获左/右、上/下、中心概念的最小尺寸),卷积步长固定为 1,各卷积层采用 SAME padding。VGGNet 的池化层使用了最大池化,核大小为 2 × 2,步长为 2,相当于将输入减半。VGGNet 拥有 5 个卷积段,每一段内有 2 ~ 3 个卷积层,段内的卷积核数量相等,卷积层的通道数起始为 64,随后每经过一个卷积段通道数乘以 2,直至 512,每个卷积段都后接了一个最大池化层,即共有 5 个池化层。不同级别的 VGGNet 网络结构如图 2.1 所示,其中,A-LRN 在第一个卷积层使用了 AlexNet 中的 LRN (局部响应归一化),但该归一化没有改善模型 A 在 ILSVRC 数据集上的性能,反而增加了内存消耗和计算时间;另外,模型 C 较模型 B 添加了 1 × 1 卷积层,1 × 1 卷积在不影响卷积层感受野的情况下增加了决策函数的非线性 (虽然 1 × 1 的卷积操作是线性的,但是 ReLU 增加了非线性),与模型 B 相比,模型 C 具有更好的性能。但是模型 C 的性能不如模型 D,表明了尽管附加非线性确实有助于模型性能的提升,但是通过使用具有更大感受野的卷积核来捕获空间上下文也非常重要。


VGG-Net网络结构图
图 2.1 VGGNet 网络结构图

      VGGNet 的网络配置与 AlexNet 和 ZFNet 有很大的不同,与 AlexNet 和 ZFNett 在第一层使用较大的感受野不同 (AlexNet 使用了 11 × 11 的卷积核,4 的卷积步长;ZFNet 中使用 7 × 7 的卷积核,2 的卷积步长),VGGNet 整个网络都是用了非常小的 3 × 3 的感受野,卷积步长为 1。两个 3 × 3 的卷积层(中间不带空间池化)和一个 5 × 5 的卷积层具有相同的感受野(假设输入的是一个 5 × 5 的图像,用 3 × 3 的卷积核卷积之后输入图像变成 3 × 3,再用一个 3 × 3 的卷积核卷积后输入图像变成 1 × 1。这和直接用一个 5 × 5 的卷积核卷积图像是一样的效果),三个 3 × 3 的卷积层串联相当于一个 7 × 7 卷积层的感受野。使用三个 3 × 3 的卷积层替代单个 7 × 7 的卷积层有如下两个好处
      1) 增加非线性。引入三个 ReLU 单元而不是单单一个,使得决策函数更具辨别力;
      2) 减少模型参数。假设输入与输出的通道数都为 C,则三组 C 个 3 × 3 × C 卷积核的参数个数为 3×(32C)×C=27C2,而一组 C 个 7 × 7 × C 卷积核的参数个数为 (72C)×C=49C2
      使用多个串联的小的卷积层替代单个大的卷积存在一个不足:在进行反向传播时,中间的卷积层可能会导致占用更多的内存。

3 分类框架

3.1 训练

      VGGNet 通过使用带有动量的小批量梯度下降来优化多项逻辑回归目标函数以进行模型的训练,使用了L2正则化并且在前两个全连接层中使用了 Dropout。与 AlexNet 训练时学习率的设置相同,采用启发式的方法进行学习率的调整,即在验证错误率停止下降时将当前的学习率除以 10,整个训练过程学习率共减小了 3 次。虽然 VGGNet 较 AlexNet 具有更多的参数,但是 VGGNet 的收敛速度比 AlexNet 快,原因可能为:① 更大的深度和更小的卷积核所带来的隐性的正则化;② 某些层的预初始化。
      网络权重的初始化很重要,因为坏的初始化可能由于深度网络中梯度的不稳定性而导致网络停止学习。为了规避这个问题,作者使用了一个小技巧:先训练图 2.1 中较浅的网络 A,使用随机初始化的方法初始化 A 的权重;然后在训练更深的模型时使用 A 初始化前四个卷积层和最后的三个全连接层,对中间的层应用随机初始化。随机初始化的中,从均值为 0,方差为 0.01 的正态分布中抽样权重,偏置初始化为 0。
      为了获得VGGNet固定大小的输入(224 × 224),作者采用了从重缩放训练样例中随机裁剪的方法,每一次 SGD 迭代裁剪一个。为了进一步扩大训练集,对裁剪的图片进行随机的水平翻转和随机的颜色转移。
      训练图片大小。令 S 表示各向同性缩放的训练图片中较小的边,从中截取网络的输入。当裁剪尺寸固定为 224 × 224 时,原则上 S 可以取不小于 224 的任何值:当 S = 224 时,裁剪将会捕获整个图像的统计数据,将会完整横跨训练图像的最小边;当 S >> 224 时,裁剪仅对应于原始图片很小的一部分,包含一个目标或者目标的一部分。作者使用了两种设置训练尺寸 S 的方法:
      1)固定 S 的大小,对应了单一尺度的训练。作者使用了两个 S 值,分别为 S = 256 和 S = 384。给定一个网络配置,首先使用 S = 256 进行训练,为了加快对 S = 384 网络的训练,使用 S = 256 预训练的结果进行权重初始化;
      2)多尺度(Multi-scale)训练,使用从 [Smin,Smax] 中随机抽样的 S 对每个训练图片单独地进行重缩放(作者设置 Smin=256Smax=384)。因为图像中的目标可能具有不同的大小,因此在训练期间将这一点考虑进去是非常有益的,也可以认为通过尺度抖动(scale jittering)增加了训练集的数量,其中训练的单个模型可以识别较大范围尺度上的目标。出于速度上的考虑,作者通过微调具有相同配置的单尺度模型的所有层来训练多尺度模型,使用固定的 S = 384 进行预训练。

3.2 测试

      测试流程如下:
      1)将输入图片各向同性缩放发到尺寸 Q,Q 是预定义的图像的最小边。Q 并不一定与 S 相等,对于每个 S 使用几个不同的 Q 值可以带来网络性能的提升。
      2)将缩放后的测试图片输入到网络中进行计算。首先将全连接层转化为卷积层(第一个 FC 层转换为 7 × 7 的卷积层,后两个 FC 层转化为 1 × 1 卷积层),然后将得到的全卷积网络应用于整个(未裁剪)图片。网络计算的结果是一个类别分数图,其中通道数量等于类别数量,可变的空间像素取决于输入图片的大小。最后,对类别分类图进行空间平均,从而获得测试图像的固定大小的类别分数向量(即将不同窗口的分类结果平均)。另外,作者对测试图片进行了水平翻转,将原始图像和翻转图像的 soft-max 分类后验概率进行平均以获得该图像分类的最终分数。
      因为在整个图像上应用了全卷积神经网络,所以在测试时不需要从多个裁剪中进行抽样。采用抽样的方式很低效,因为网络需要对每个裁剪重新进行计算。但是与此同时,使用大量的裁剪相较于全卷积网络具有更精细的采样,因此可以带来精度的提升。此外,由于不同的卷积边界条件,多裁剪评估与密集评价互补:当将网络应用于剪裁的图像时,卷积特征图用 0 进行填充;而在密集评估时,用于相同的裁剪的图像的填充自然来自于图像的相邻部分,这大大增加了整个网络的感受野,因此可以捕获到更多的上下文信息。但是作者认为,在实践中多采样所带来的计算时间的增加与潜在的准确率提升并不相称。

3.3 实现细节

      可以在单系统多 GPU 的环境中训练和评估 VGGNet,并且可以在多尺度上对全尺寸的图片进行训练和评估。多 GPU 训练利用了数据并行化,通过将每批训练图像分割成若干个 GPU 小批块来在每块 GPU 上并行处理。在计算出 GPU 小批块梯度之后,对它们进行平均以获得整个批次的梯度。梯度计算在多个GPU上是同步的,因此与在单个GPU上训练时的结果完全相同。

4 分类实验

      在大部分的实验中,作者使用验证集作为测试集,在测试集上也进行了一些实验并提交给了官方的 ILSVRC 服务器。

4.1 单一尺度评估

      测试图片的大小设置如下:对于固定的 S,Q = S;对于抖动的 S[Smin,Smax]Q=0.5(Smin+Smax) 。测试结果图表 4.1 所示。


表4.1 单测试尺度网络性能
这里写图片描述

      从表 4.1 可以看出,① 使用局部响应归一化(A-LRN)并没有改善模型 A (没有使用任何归一化层)的性能;② 分类误差随着网络深度的增加而减小。作者构建了一个使用 5 × 5 卷积的浅层神经网络,该网络的构建是通过将 B 中每一对 3 × 3 卷积替换为 5 × 5 卷积实现的,因此两个模型的卷积层拥有相同的感受野,最后 5 × 5 卷积的浅层神经网络的 top-1 错误率比模型 B 高了 7%,证明了使用小卷积核的深层网络比使用大卷积核的浅层网络性能更好。此外,即使在测试时使用单一的尺度,训练时的尺度抖动 (S[Smin,Smax]) 比在具有固定最小边 (S=256S=384) 的图像上训练具有更好的结果。这证实了通过尺度抖动增加训练集确实有助于捕获多尺度图像统计数据。

4.2 多尺度评估

      多尺度评估在测试的时候评估尺度抖动的影响。它包括在一个测试图像的几个重缩放版本上 (对应于不同的 Q 值) 运行一个模型,然后平均所得到的类的后验概率。考虑到训练和测试尺度之间大的差异会导致性能的下降,使用固定的 S 训练的模型在三个测试图像尺度(接近于训练时的尺度:Q={ S - 32, S , S + 32})上进行评估。同时,训练时的尺度抖动使得网络在测试时应用于更宽的尺度范围,因此使用变化的 S[Smin,Smax] 训练模型,并在较大的尺度范围内进行评估 (Q={Smin,0.5(Smin+Smax),Smax})。测试结果如表 4.2 所示。


表 4.2 多测试尺度网络性能
这里写图片描述

      表 4.2 表明,测试时的尺度抖动可以带来更好的性能。另外,以之前一样,最深的配置(D 和 E)表现最好,并且使用尺度抖动比固定最小边 S 的训练效果要好。

4.3 多裁剪评估

      在表 4.3 中,作者比较了密集 ConvNet 评估和多裁剪评估。此外,作者还通过平均它们的 Softmax 输出来评估两种评估技术的互补性。可以看出,使用多剪裁表现要略好于密集评估,并且这两种方法确实是互补的,因为它们的结合优于它们中的每一种。如 3.2 节描述,作者猜测这是由于卷积边界条件的不同处理造成的。


表 4.3 多裁剪评估
这里写图片描述

4.4 模型融合

      不同模型融合方案的结果如表4.4 所示。


表 4.4 多模型融合结果
这里写图片描述

      从表中可以看出,只融合 D 和 E 两个模型比融合 7 个模型的测试误差更小。

5 结论

      深度有益于分类准确度。

参考文献

[1] https://blog.csdn.net/wangsidadehao/article/details/54311282
[2] https://blog.csdn.net/marsjhao/article/details/72955935
[3] https://blog.csdn.net/wcy12341189/article/details/56281618


版权声明:本文为博主原创文章,转载请注明出处。

阅读更多
文章标签: DeepLearning CNN VGGNet
个人分类: 深度学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭