深度学习(3)VGGNet 神经网络结构

深度学习(3)

    • 结构简介
    • 结构特点
    • 网络架构
    • 网络解读
    • 网络训练
      • ==**训练输入:**==
      • ==**Multi-scale训练**==
      • **预测方式**:作者考虑了两种预测方式:
    • 网络预测结果
    • 网络结构可视化
    • 网络的Caffe实现

结构简介

VGGNet是2014年 ILSVRC 分类亚军及定位冠军模型,top-5 错误率 7.3% ,vgg继承了lenet以及alexnet的一些框架,有16~19层,vggnet虽然在分类成功率上稍显逊色,但在多个迁移学习任务中表现优于googlenet,同时VGGNet的拓展性很强,迁移到其他图片数据上的泛化性非常好。而且 从图像中提取CNN特征,VGGNet是首选方法。VGG的缺点是需要更大的存储空间,参数总量达140M

VGGNet是牛津大学计算机视觉组(VisualGeometry Group)和GoogleDeepMind公司的研究员一起研发的的深度卷积神经网络。VGGNet探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3 * 3的小型卷积核和2 * 2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络。VGGNet相比之前state-of-the-art的网络结构,错误率大幅下降。

结构特点

最主要的贡献点:发现使用小尺寸的卷积核能够设计比较深的网络。

  • 相对于AlexNet的主要改进点:
  1. 在第一卷积层使用更小的filter尺寸和间隔;
  2. 在整个图片和multi-scale上训练和测试图片;
  • 特点:
  1. 3*3是最小的能够捕捉上下左右和中心概念的尺寸;

  2. 两个3 * 3的卷积层串联相当于1个5 * 5的卷积层,3个3 * 3的卷积层串联的效果则相当于1个7*7的卷积层;

  3. 多个3*3的卷积层比1个大尺寸的卷积层有更多的非线性变换(前者可以使用多次ReLU激活函数),使判决函数更加具有判决性;

  4. 多个3*3的卷积层比1个大尺寸的卷积层有更少的参数;

现在解释参数变少的问题。
假设现在有 3 层 3x3 卷积核堆叠的卷积层,卷积核的通道是 C 个,那么它的参数总数是 3x(3Cx3C) = 27C^2。同样和它感受野大小一样的一个卷积层,卷积核是 7x7 的尺寸,通道也是 C 个,那么它的参数总数就是 49C^2。通过计算很容易得出结论,3x3 卷积方案的参数数量比 7x7 方案少了 81% 多,并且它的层级还加深了。

网络架构

VGGNet的结构非常简洁,整个网络都使用了同样大小的卷积核尺寸(3* 3)和最大池化尺寸(2*2)。到目前为止,VGGNet依然经常被用来提取图像特征。VGGNet训练后的模型参数在其官方网站上开源了,可用来在特定的图像分类任务上进行再训练 (相当于提供了非常好的初始化权重),因此被用在了很多地方。

深度学习(3)VGGNet 神经网络结构_第1张图片
VGGNet论文中全部使用了3 * 3的卷积核和2*2的池化核,通过不断加深网络结构来提升性能。图1-2所示为VGGNet各级别的网络结构图,图3所示为每一级别的参数量,从11层的网络一直到19层的网络都有详尽的性能测试。
深度学习(3)VGGNet 神经网络结构_第2张图片

  • 介绍结构图的式子含义

    • conv3-64 :是指第三层卷积后维度变成64,conv3-128指的是第三层卷积后维度变成128;
    • input(224x224 RGB image) :指的是输入图片大小为224 * 244的彩色图像,通道为3,即224 * 224*3;
    • maxpool :是指最大池化,在vgg16中,pooling采用的是2*2的最大池化方法;
    • FC-4096 :指的是全连接层中有4096个节点,FC-1000为该层全连接层有1000个节点;
    • padding:指的是对矩阵在外边填充n圈,padding=1即填充1圈,5X5大小的矩阵,填充一圈后变成7X7大小;
    • vgg16每层卷积的滑动步长stride=1,padding=1,卷积核大小为3 * 3 *3;

在这里插入图片描述

虽然从A到E每一级网络逐渐变深,但是网络的参数量并没有增长很多,这是因为参数量主要都消耗在最后3个全连接层。前面的卷积部分虽然很深,但是消耗的参数量不大,不过训练比较耗时的部分依然是卷积,因其计算量比较大。这其中的D、E也就是我们常说的VGGNet-16和VGGNet-19。C很有意思,相比B多了几个1*1的卷积层,1*1卷积的意义主要在于线性变换,而输入通道数和输出通道数不变,没有发生降维。

网络解读

VGGNet拥有5组卷积,每一组内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。每段内的卷积核数量一样,越靠后的段的卷积核数量越多:64-128-256-512-512。其中经常出现多个完全一样的3*3的卷积层堆叠在一起的情况,这其实是非常有用的设计。

如图4所示,两个33的卷积层串联相当于1个55的卷积层,即一个像素会跟周围55的像素产生关联,可以说感受野大小为55。而3个33的卷积层串联的效果则相当于1个77的卷积层。除此之外,3个串联的33的卷积层,拥有比1个77的卷积层更少的参数量,只有后者的(333)/(77)=55%。最重要的是,3个33的卷积层拥有比1个7*7的卷积层更多的非线性变换(前者可以使用三次ReLU激活函数,而后者只有一次),使得CNN对特征的学习能力更强
深度学习(3)VGGNet 神经网络结构_第3张图片
堆叠后的 3x3 卷积层可以对比之前的常规网络的基础上,减少参数数量,而加深网络。
但是,如果我们还需要加深网络,怎么办呢?堆叠更多的的卷积层,但有 2 个选择。

  • 选择 1:继续堆叠 3x3 的卷积层,比如连续堆叠 4 层或者以上。

  • 选择 2:在 3x3 的卷积层后面堆叠一层 1x1 的卷积层。

1x1 卷积核的好处是不改变感受野的情况下,进行升维和降维,同时也加深了网络的深度。

网络训练

训练输入:

  1. 输入是大小为224*224的RGB图像,预处理只有在训练集中的每个像素上减去RGB的均值
  2. 采用随机裁剪的方式,获取固定大小224x224的输入图像。并且采用了随机水平镜像和随机平移图像通道来丰富数据。
  3. Training image size:令S为图像的最小边,如果最小边S=224,则直接在图像上进行224x224区域随机裁剪,这时相当于裁剪后的图像能够几乎覆盖全部的图像信息;如果最小边S>>224,那么做完224x224区域随机裁剪后,每张裁剪图,只能覆盖原图的一小部分内容。

VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。

Multi-scale训练

首先对原始图片进行等比例缩放,使得短边要大于224,然后在图片上随机提取224x224窗口,进行训练。由于物体尺度变化多样,所以多尺度(Multi-scale)可以更好地识别物体。

  1. 方法1:在不同的尺度下,训练多个分类器:
    参数S为短边长。训练S=256和S=384两个分类器,其中S=384的分类器用S=256的进行初始化,且将步长调为10e-3
  2. 方法2:直接训练一个分类器,每次数据输入的时候,每张图片被重新缩放,缩放的短边S随机从[256,512]中选择一个。

Multi-scale其实本身不是一个新概念,学过图像处理的同学都知道,图像处理中已经有这个概念了,我们学过图像金字塔,那就是一种多分辨率操作。

只不过VGG网络第一次在神经网络的训练过程中提出也要来搞多尺寸。目的是为了提取更多的特征信息。像后来做分割的网络如DeepLab也采用了图像金字塔的操作。

注: 因为训练数据的输入为224x224,从而图像的最小边S,不应该小于224

在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224*224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。

实践中,作者令S在[256,512]这个区间内取值,比固定的S=256与S=512的结果显著提升,使用Multi-Scale获得多个版本的数据,并将多个版本的数据合在一起进行训练

multi-scale训练确实很有用,因为卷积网络对于缩放有一定的不变性,通过multi-scale训练可以增加这种不变性的能力。

预测方式:作者考虑了两种预测方式:

  1. multi-crop,即对图像进行多样本的随机裁剪,然后通过网络预测每一个样本的结构,最终对所有结果平均
  2. densely, 利用FCN的思想,将原图直接送到网络进行预测,将最后的全连接层改为1x1的卷积,这样最后可以得出一个预测的score map,再对结果求平均
  • 上述两种方法分析:
    1. Szegedy et al.在2014年得出multi-crops相对于FCN效果要好;
    2. multi-crops相当于对于dense evaluatio的补充,原因在于,两者在边界的处理方式不同:multi-crop相当于padding补充0值,而dense evaluation相当于padding补充了相邻的像素值,并且增大了感受野;
    3. multi-crop存在重复计算带来的效率的问题。

最终,作者认为相对于multi-crop的在精度上的提高并不能弥补其在计算量上的消耗,但作者最后还是对比了这两种方法的效果

网络预测结果

  • 测试步骤
  1. 首先进行等比例缩放,短边Q(类似训练集的S)大于224
  2. 将网络中全连接层转换为卷积层,第一个全连接层转换为7*7的卷积层,第二个转换为1 * 1的卷积层

图5所示为VGGNet使用Multi-Scale训练时得到的结果,可以看到D和E都可以达到7.5%的错误率。最终提交到ILSVRC 2014的版本是仅使用Single-Scale的6个不同等级的网络与Multi-Scale的D网络的融合,达到了7.3%的错误率。不过比赛结束后作者发现只融合Multi-Scale的D和E可以达到更好的效果,错误率达到7.0%,再使用其他优化策略最终错误率可达到6.8%左右,非常接近同年的冠军Google Inceptin Net。

VGG-19 表现的结果自然最好。但是,VGG-19 的参数比 VGG-16 的参数多了好多。所以,综合考虑大家似乎更喜欢 VGG-16。

  • 同时,作者在对比各级网络时总结出了以下几个观点:
    (1)LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。);
    (2)越深的网络效果越好
    (3)1 * 1的卷积也是很有效的,但是没有3*3的卷积好,大一些的卷积核可以学习更大的空间特征。

  • 网络深度对结果的影响(同年google也独立发布了深度为22层的网络GoogleNet)

    1. VGG与GoogleNet模型都很深
    2. 都采用了小卷积
    3. VGG只采用3x3,而GoogleNet采用1x1, 3x3, 5x5,模型更加复杂(模型开始采用了很大的卷积核,来降低后面卷积层的计算)

深度学习(3)VGGNet 神经网络结构_第4张图片

  • 在训练的过程中,比AlexNet收敛的要快一些,因为:

    1. 使用小卷积核和更深的网络进行的正则化
    2. 在特定的层使用了预训练得到的数据进行参数的初始化。
  • 正则化方法:
    在这里插入图片描述

对于较浅的网络,如网络A,可以直接使用随机数进行随机初始化,而对于比较深的网络,则使用前面已经训练好的较浅的网络中的参数值对其前几层的卷积层和最后的全连接层进行初始化。

  • 多尺度
    深度学习(3)VGGNet 神经网络结构_第5张图片
    1. 对比单尺度预测,多尺度综合预测,能够提升预测的精度
    2. 同单尺度预测,多尺度预测也证明了scale jittering的作用

网络结构可视化

深度学习(3)VGGNet 神经网络结构_第6张图片
深度学习(3)VGGNet 神经网络结构_第7张图片

网络的Caffe实现

VGG和GoogLenet是2014年imagenet竞赛的双雄,VGG主要分为VGG16和VGG19。其网络结构与预训练模型的地址如下:
VGG16的网络结构:https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md

VGG16的预训练模型: http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_16_layers.caffemodel

VGG19的网络结构:https://gist.github.com/ksimonyan/3785162f95cd2d5fee77#file-readme-md

VGG19的预训练模型:http://www.robots.ox.ac.uk/~vgg/software/very_deep/caffe/VGG_ILSVRC_19_layers.caffemodel

备注:上面的网络结构需要进行细微调整才能在Caffe中直接训练,主要是网络结构中的Type类型

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