VGG: Very Deep Convolutional Networks for Large-Scale Image Recognition

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36825778/article/details/102588965

一、论文研究背景、成果

1.论文研究背景

自从2012年AlexNet将深度学习的方法应用到ImageNet的图像分类比赛中并取得state of the art的惊人结果后,大家都竞相效仿并在此基础上做了大量尝试和改进
1.小卷积核
在第一个卷积层用了更小的卷积核和卷积stride (Zeiler & Fergus, 2013;Sermanet et al, 2014)
2.多尺度
训练和测试使用整张图的不同尺度(Sermanet et al., 2014;Howard, 2014) .

vgg作者不仅将上面的两种方法应用到自己的网络设计和训练测试阶段,同时还考虑了网络深度对结果的影响

2.论文研究成果

在2014年在ILSVRC比赛上获得了分类项目的第二名(第一是GoogLeNet) ,和定位项目的第一名。同时模型对其他数据集有很好的泛化能力。

VGG由于其结构简单,提取特征能力强,所以应用场景广泛

例如:
快速风格迁移算法
目标检测的backbone,提取特征(fater rcnn, ssd等)
gan网络内容特征提取,进行内容计算(内容损失是gan网络损失的一部分)
在这里插入图片描述

二、论文研究方法

进行了六组对比试验,包括A,A-LRN,B,C,D,E六种不同的网络结构

A-LRN在A的基础上加入了一个LRN层
B在A的基础上加入了两个3*3的卷积层
C在B的基础上加入了三个1*1的卷积层
D在B的基础上加入了三个3*3的卷积层
E在D的基础上加入了三个3*3的卷积层
在这里插入图片描述

单尺度测试结果对比

在这里插入图片描述
结论:
1、 LRN对网络性能提升没有帮助
2、 对于同一个网络结构多尺度训练可以提高网络精度
3、 E模型(VGG19)效果最好,一定程度加深网络可以提高网络精度

多尺度测试结果对比

在这里插入图片描述
结论:
1、对比单尺度预测,多尺度综合预测,能够提升预测的精度
证明了scale jittering(尺度抖动)的作用
2、 vgg16为best model

在这里插入图片描述
结论:dense evaluation & multi-crop 两种测试方式联合使用效果最好

在这里插入图片描述
结论:融合模型D、E之后模型错误率进一步下降

三、论文结论

1、在一定范围内,通过增加深度能有效地提升性能
2、最佳模型: VGG16,从头到尾只有3x3卷积与2x2池化,简洁优美
3、多个小卷积核比单个大卷积核性能好(与AlexNet对比可知)
4、AlexNet曾经用到的LRN层并没有带来性能的提升,因此在其它组的网络中均没再出现LRN层
5、尺度抖动scale jittering (多尺度训练,多尺度测试)有利于网络性能的提升

四、感受野

1.感受野概念

感受野(Receptive Field)的定义是:卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点跟原图上有关系的点的区域。

感受野概念为什么重要?
感受野被称作是CNN中最重要的概念之一,目标检测流行的算法比如SSD, Faster Rcnn等中prior box和Anchor box的设计都是以感受野为依据做的设计。

示例
在这里插入图片描述
输入原始图大小为7*7
conv1: 3*3 strides=1, valid
feature: (7-3+1)/1=5
conv2: 3*3 strides=1, valid
feature: (5-3+1)/1=3

原始输入感受野:1
conv1层感受野:3
conv2层感受野:5
如果conv1: 5*5 strides=1, valid,感受野是多少? 5

结论:
一个55卷积核感受野大小与两个33卷积核的感受野等效。
以此类推三个33的卷积核感受野与一个77卷积核的感受野等效

2.感受野的计算

感受野计算公式 r n = r n 1 + ( k n 1 ) i = 1 n 1 s i r_n=r_{n-1}+(k_n-1)\prod \limits_{i=1}^{n-1}s_i
其中, r n 1 r_{n-1} 为上一层感受野大小, k n k_n 为本层卷积核尺寸, s i s_i 卷积步幅

示例:
conv1: 3*3 strides=1 valid
conv2: 3*3 strides=1 valid
conv3: 3*3 strides=2 valid
conv4: 3*3 strides=1 valid
maxp: 2*2 strides=2
(计算感受野时, maxp看做conv: 2*2,strides=2)

原图感受野: 1
conv1:1 +(3-1)=3
conv2: 3+(3-1)*1=5
conv3: 5+(3-1)*1*1 =7
conv4: 7+(3-1)*1*1*2=11
maxp: 11+(2-1)*1*1*2*1=13

注意:
这只是理论感受野,实际上起作用的感受野是小于理论感受野的

五、网络结构及权重参数计算

1.网络结构

在这里插入图片描述

VGG的网络结构:
在这里插入图片描述
说明:
1.所有卷积层使用的是SAME卷积操作,stride等于1,所以卷积层不会改变尺寸
2.池化层尺寸为2*2,stride等于2,所以每经过一个池化层,尺寸减少一半

2.参数计算在这里插入图片描述

3.卷积核

一、为什么要使用3*3的卷积核?
1.深度更深并增加了非线性

  • 3个3*3的卷积核的感受野与1个7*7的卷积核的感受野等效,但是3个3*3的卷积之间加入了非线性激活函数,与仅使用1个7*7的卷积相比,深度更深而且增加了非线性

2.参数量减少

  • 假设输入数据通道大小为C,3个C通道的3*3的卷积核参数量为: 3 ( 3 3 C ) C = 27 C 2 3*(3*3*C)*C=27C^2 ,1个C通道的7*7的卷积核参数量为: 7 7 C C = 49 C 2 7*7*C*C=49C^2

二、1*1的卷积核的作用是什么?

  • 一种为决策增加非线性因素的方式
  • 调整网络维度,扩维或缩小维度

例如:Mobilenet使用1*1的卷积核来扩维,Resnet使用1*1卷积核来减小维度

六、网络超参数及训练数据处理

1.训练数据处理

各向同性缩放(等比缩放)训练图像的最小边
以S=256为例

  1. 将图片进行等比变化,最小边长度为256
  2. 对等比变化后的图像随机截取224*224的图像块
  3. 对裁剪的图像块进行随机水平翻转与RGB颜色转换

在这里插入图片描述
在这里插入图片描述

多尺度数据

多尺度指的是:原图像的最小边在一个范围内变化
在这里插入图片描述

超参数设置

批量大小: batchsize = 256
权重衰减: weight decay = 5*10-4

学习率: learning rate= 0.01
衰减因子为0.1
动量: momentum = 0.9(优化方式为带动量的SGD)
迭代步数: 370K
轮数: epoches =751

卷积核初始化方式: 均值为0方差为1的高斯分布(深层网络使用浅层网络权重初始化)
偏置初始化方式: 初始化为0
全连接层初始化方式: 高斯分布(std=0.005) , bias常数初始化(0.1)

网络特点

1.小卷积核
VGG使用多个小卷积核(3x3)的卷积层代替大的卷积核,一方面可以减少参数,另一方面相当于进行了更多的非线性映射,以增加网络的拟合/表达能力

2.小池化核
相比AlexNete3x3的池化核, VGG全部采用2x2的池化核

3.层数更深
vgg常用结构层数为16层, 19层(仅计算conv,fc层) Alexnet有为8层 (5个conv,3个fc)

4.全连接转卷积
网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为输入

卷积层替换全连接层

全连接层的计算公式: f c = w T x + b f_c=w^Tx+b
假设输入到全连接层特征大小为 7 7 5 7*7*5 ,输出的特征大小为 1000 1 1000*1
首先将输入特征变为一个列向量
7 7 5 > ( 245 , 1 ) 7*7*5--> (245, 1)
则x大小为(245, 1)
然后与全连接层的权重相乘,偏置相加
w的大小为(245, 1000) b的大小为 ( 1000 1 ) (1000*1)

假如测试时输入到全连接层的特征大小为 14 14 5 14*14*5 ,我们需要输出的特征大小依旧为 1000 1 1000*1
x变为大小为(980,1)
而此时w的大小为(245, 1000),就会出现尺寸不匹配的问题

如果使用卷积层使用1000个 7 7 5 7*7*5 的卷积代替fc层卷积参数量为 7 75 1000 = 245 1000 7*7 5*1000=245* 1000 与fc层参数量相同,所以可以将fc层学习到的参数赋给卷积层

假设输入特征为 7 7 5 7*7*5 , 令stride=1,最后输出尺度为 [1, 1, 1, 1000]可以降维为[1, 1000]
如果输入特征为 14 14 5 14*14*5 ,最后得到特征为[1, 2, 2, 1000]即为一个scoremap,我们对它求平均得到[1,1000]向量
在这里插入图片描述

七、微调知识(迁移学习)

1.微调概念

简单描述:
使用预训练的神经网络模型,来训练我们自己的数据集合。即使用训练好的权重来初始化我们的网络,并不是随机初始化。
在实践中,我们通常不会完全从头开始随机初始化训练DCNN,这是因为有能满足深度网络需求的足够大小的数据集相当的少见。作为代替,常见的是在一个大型数据集上预训练一个DCNN,然后使用这一训练的DCNN的权重作为初始设置或作为相关任务的固定的特征提取器。

什么情况下使用?

  • 自己设计的网络不好用,精度太低
  • 数据集合相似但是数据量小
  • 自己的计算资源不够

为什么微调会有效?
神经网络浅层学习的是通用特征基础特征,比如边缘,轮廓颜色等特征。深层是针对特定数据的更抽象的特征,对于人脸来说可能就是某个人的脸。全连接层就是对特征进行组合并评分分类。
我们可以利用网络前几层学习到的通用特征,仅让网络学习数据的抽象特征,节省资源和时间。

2.不同场景

微调(Fine-Tuning) : 迁移学习策略取决于多种因素,但最重要的两个是新数据集的大小以及新数据集与原数据集的相似度
  以下是4个主要情景:

  • 新数据集量小,内容上相似: 这种情况下,通常情况我们只需要训练最后的输出层,即最后一层,因为可能分类的数量不同,最后一层需要做修改。(平时最常见)
  • 新数据集量大,内容上相似:这是最理想的情况,我们可以微调整个网络,因为数据量足够大不用担心过拟合。
  • 新数据集量小,内容不相同:由于数据较小,且相似度低,这种情况使用微调效果不是很好,可以尝试冻结前边大部卷积层,重新训练网络的高层卷积层及全连接层。
  • 新数据集量大,内容不相同:由于数据集很大,且相似度比价低,最好不要使用预训练模型,从头开始训练整个网络。

猜你喜欢

转载自blog.csdn.net/qq_36825778/article/details/102588965