深度学习之图像分类--VGG

目录

1 简介

2 网络结构

网络结构的特点

使用多个3*3叠加的原因

使用1*1的卷积核

3 VGGNet网络的参数

参数和计算量的对比

4 VGGNet的训练

超参数的设置

图片的处理

5 VGGNet的测试

将全连接换成全卷积

多重裁剪评估方式

5 VGGNet实验结果

5.1 单尺度评估

5.2 多尺度评估

5.3 多重裁剪评估

5.4 多个网络结合

5.5 多种方法的对比

 


1 简介

VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,获得了2014年ILSVRC竞赛的分类任务第二名和定位任务第一名,主要贡献在于证明了使用3x3小卷积核,增加网络深度可以有效提升模型性能,并且对于其他数据集也有很好的泛化性能。

论文链接:Very deep convolutional networks for large-scale image recognition

2 网络结构

论文中一共提供了6种网络配置,层数从浅到深分别为11层、13层、16层和19层。其中11层时,主要比较了Local Response Normalisation(LRN)的作用,结果是LRN并没有提升网络性能。

深度学习之图像分类--VGG_第1张图片          深度学习之图像分类--VGG_第2张图片

网络结构的特点

  1. 网络有5段卷积,每段卷积内分别有22333个卷积层,每段后面跟着个最大池化层
  2. 每段内的卷积核数量一样,越后边段内卷积核数量越多,依次为64-128-256-512-512

使用多个3*3叠加的原因

(两个3*3相当于5*5的感受野)

  1. 保持感受野相同的情况下,参数更少
  2. 增加了非线性,使网络对特征的学习能力更强

使用1*1的卷积核

  1. 在不影响感受野的情况下,增加非线性
  2. 用来调整特征图的channel的维度(这里没有使用)

3 VGGNet网络的参数

  • 现象:网络逐渐变深,参数量并没有增加很多。
  • 原因:参数量主要消耗在最后的3个全连接层,前面的卷积层数虽多,但参数消耗量不大。(但卷积层训练比较耗时,因为计算量大)

举例:19层网络的参数计算

num = 3*3*3*64 + 64*3*3*64 +\            # 1-2层
      64*3*3*128 + 128*3*3*128 + \       # 3-4层
      128*3*3*256 + 256*3*3*256*3 + \    # 5-8层
      256*3*3*512 + 512*3*3*512*7 + \    # 9-16层
      7*7*512*4096 + 4096*4096 + 4096*1000 + \      #17-19层
      64*2 + 128*2 + 256*4 + 512*8 + 4096*2 + 1000  #每层的偏置
  • 某一层偏置参数的个数=输出的channels(自己忘了,查阅后特地标注)

参数和计算量的对比

在计算量这里,为了突出小卷积核的优势,我拿同样conv3x3、conv5x5、conv7x7、conv9x9和conv11x11,在224x224x3的RGB图上(output_channel=96)做卷积,卷积层的参数规模和得到的feature map的大小如下:

kernel conv param: A           (与步长、padding无关) feature map: B          计算量     (kernel_param * B * 2)
conv3x3 3x3x3x96  (2592) 224x224x96 (4816896) ‭260,112,384‬    [(3x3x3)x(224x224x96)x2]
conv5x5 5x5x3x96  (7200) 224x224x96 (4816896) ‭722,534,400‬    [(5x5x3)x(224x224x96)x2]
conv7x7 7x7x3x96  (14112) 224x224x96 (4816896) ‭1,416,167,424‬   [(7x7x3)x(224x224x96)x2]
conv9x9 9x9x3x96  (23328) 224x224x96 (4816896) ‭2,341,011,456‬   [(9x9x3)x(224x224x96)x2]
conv11x11 11x11x3x96  (34848) 224x224x96 (4816896) ‭3,497,066,496‬   [(11x11x3)x(224x224x96)x2]
       
训练时网络的参数量:   (A + B)          // A、B为参数个数
计算量:       kernel_param * B * 2     // kernel_param: 3x3x3、5x5x3等
  • 计算量:思考角度为特征图,特征图的B个参数,每一个参数都是经过单层的卷积核计算而来,每个单层卷积层有kernel_param个参数,需要经过kernel_param个计算。前项和后向共两次,所以再乘以2。
  • 对于该例子:卷积层本身的参数占少数,不同的卷积层出来的特征图参数400w;conv3*3的计算量达到2亿,conv11*11的计算量达到30亿。  所以,使用两个conv3*3代替conv5*5,网络本身参数由7200-->‭5184‬(2592+2592),计算量由7亿-->5亿(2.6亿+2.6亿)

 

4 VGGNet的训练

超参数的设置

  1. 训练使用加动量的小批基于反向传播的梯度下降法来优化多项逻辑回归目标
  2. batch size为256,momentum设为0.9,权重衰减系数为0.0005
  3. 前两层的全连接后面跟着Dropout,设置为0.5
  4. 学习率初始为0.01,当验证集的准确率停止提高时,学习率除以10。最终学习率降低了三次以后,网络就收敛了
  5.  对于深度网络来说,网络的权重初始化十分重要。为此,论文中首先训练了一前程的网络结构A(第一个图中),训练折后网络时,随机初始化他的权重就足够得到比较好的结果。然后,当训练深层的网络时,前四层卷积核最后三个全连接层使用的是学习好的A网络的权重来进行初始化,其余层则随机初始化。(即某些层的预初始化)

图片的处理

(1)首先将图片保持高宽比进行缩放,使最短边缩放至S(S>=224)。由于要求输入224*224大小,再对缩放后的图片进行crop。
S的取值方法:

  1. 固定的尺寸。对所有的图片,S都是固定的值。论文考察了S=256和S=384两种情况下分别训练得到的网络性能。为了加速,训练S=384的网络时,使用的训练好的S=256的网络来初始化权重,并且学习率更小,为0.001
  2. 可变的尺寸。设置一个范围[Smin, Smax],每一张图片都从这个范围中随机选取一个数作为它的S。论文中使用的范围是[256, 512]。这个方法叫做尺度抖动scal jittering,有利于训练集增强,这使得训练在一个很大范围的图像尺度之上进行。为了加速,通过微调S=384的固定尺寸的网络来训练得到可变尺度的网络

(2)为了更进一步的增加训练集,对每张图片进行水平翻转以及进行随机RGB色差调整

 

5 VGGNet的测试

将全连接换成全卷积

深度学习之图像分类--VGG_第3张图片

相同处:

  • 两种方式,网络的参数是相同的。对于输入固定的输入,效果也是相同的。

不同处:

  • 全连接的多次输入时,必须保持输入维度不变
    • 需要保证网络的测试的图片保持相同的大小。
    • 一张大图裁剪成多张224*224小图,重复的部分就会多次进入网络进行计算,产生很多冗余计算
  • 卷积是可以接受不同尺寸的信息。这样:
    • 图片输入时,不需要提前裁剪成224*224。
    • 当图片较大的情况下,网络输出的feature map尺寸就不是1*1*1000。网络的输出还保留了得分的位置信息。在输出channel上求平均后,在输入softmax层,得到预测结果。减少冗余操作(下图例子)

深度学习之图像分类--VGG_第4张图片

多重裁剪评估方式

在GoogleLeNet中描述的详细过程如下:

  1. 将图片缩放到不同的4种尺寸(纵横比不变,GoogleLeNet使用的4种尺寸为:缩放后的最短边长度分别为:256,288,320和352)。
  2. 对于得到的每个尺寸的图像,取左、中、右三个位置的正方形图像(边长就是最短边的长度。对于纵向图像来说,则取上、中、下三个位置),因此每个尺寸的图像得到3个正方形图像;
  3. 然后再在每个正方形图像的4个crop顶点和中心位置处crop处224*224的图像,此外再加上将这个正方形图像缩放到224*224大小的图像,因此每个正方形图像得到6个224*224的图像
  4. 最后,再将所有得到的224*224的图像水平翻转。因此,每个图像可以得到4*3*6*2=144个224*224大小的图像
  5. 将这些图像分别输入神经网络进行分类,最后取平均,作为这个图像最终的分类结果。

而VGG中则使用的是3种尺寸,每个尺寸在5个位置处取正方形图像,每个正方形图像crop出5个224*224大小的图像,最后水平翻转,即3*5*5*2=150。

(个人觉得,在实际应用中这样操作是不必要的。实际应用中我们注重效果的同时还有速度)

 

5 VGGNet实验结果

    数据集 在本章,我们讲述了卷积神经网络在ILSVRC2012数据集上的分类结果。数据集包含1000个类别,被分为三部分:训练集(1.3M张图片),验证集(50K张图片),测试集(100K张图片,没有标签)。分类性能使用两个办法评估:top-1和top-5 error。前者是一个多类分类错误率,即错误分类图像的比例;后者是在ILSVRC上的主要评估标准,即真实类别不在top-5预测类别之中的图像的比例。

5.1 单尺度评估

对上面提出的模型进行测试。测试时,对于固定的S,去Q=S;对于可变的S,取Q=0.5*(Smin + Smax)。实验结果如下:

深度学习之图像分类--VGG_第5张图片

  • A和A-LRN对比:后者性能并没有提升,LRN没有好的效果
  • B和C对比(C优):C有多的1*1的卷积。说明额外的非线性可以提升网络的性能
  • C和D对比(D优):C有些1*1的卷积,D相应的是3*3卷积。说明抓取空间局部信息同样重要
  • 总的看出,误差随着网络的深度的增加而减低。
  • 训练时,使用可变的尺度训练要比固定尺度的效果要好

5.2 多尺度评估

固定S训练的网络,考虑到训练与测试尺度之间的巨大差异会导致性能的下降,测试使用的Q={S-32, S, S+32}。
尺度S抖动训练的网络,则使用Q={Smin, 0.5(Smin, Smax), Smax}。

深度学习之图像分类--VGG_第6张图片

  • 通过和单尺度的结果对比,可以发现在测试时使用多尺度(尺度抖动),可以提升准确率

5.3 多重裁剪评估

深度学习之图像分类--VGG_第7张图片

  • 可以看到,多重裁剪要比密集评估(多尺度)的结果要好。
  • 论文结论,两种方法结合的效果会更好(softmax输出求均值),两种方法是互补的。
    • 原因:卷积层提取特征时的padding方式不同。多重裁剪:补0;多尺度:补的是它们附近的像素

 

5.4 多个网络结合

论文还将训练的多个网络模型的结果相结合得到最终的分类结果,显然,这会提升分类的准确率以及稳定性,结果如下:

深度学习之图像分类--VGG_第8张图片

5.5 多种方法的对比

深度学习之图像分类--VGG_第9张图片

 

 

 

 

 

你可能感兴趣的:(cnn知识)