【论文笔记】—VGG网络—2014-ICLR

题目:Very Deep Convolutional Networks for Large-Scale Visual Recognition

用于大规模图像识别的超深卷积网络
2014年ImageNet图像定位竞赛冠军,分类竞赛亚军,分类第一是当年的GoogLeNet。

DOIarXiv:1409.1556

时间:2014-09-04上传于arxiv
会议:2015 International Conference on Learning Representations(ICLR)
机构:牛津大学Visual Geometry Group

论文链接:https://arxiv.org/abs/1409.1556
代码链接:torchvision.models.vgg — Torchvision
主页链接:Visual Geometry Group - University of Oxford

关键词:图像分类、图像定位、卷积核、深度

研究问题:研究了在大规模图像识别环境中卷积网络深度对其准确性的影响。

解决方案:
提出VGG网络,堆叠3个3x3的卷积核来代替 7x7卷积核,堆叠2个 3x3代替 5x5 的卷积核,这样做可以在保证具有相同感受野的同时,提升网络深度,并在一定程度上提升了网络的效果。

创新点:使用较小的卷积核,但较深的网络层次来提升深度学习的效果。

缺点:
1、参数多(第一个全连接层每一个神经元与上一操作拉平后的每一个参数都有权重)
2、内存大(前两个卷积层输入图像尺寸大)

------VGG网络模型------

感受野计算:
感受野(receptive fields):输出feature map上的一个单元对应的输入层上的区域大小。

计算公式:F(i) = [F(i + 1) - 1]*Stride +Ksize

其中:F(i) -第i层感受野,Stride-第i层的步距,Ksize-卷积核的大小

例如:最后一层输出:F = 1
conv3:F = (1-1)* 1 + 3 = 3
conv3:F = (3-1)* 1 + 3 = 5
conv3:F = (5-1)* 1 + 3 = 7

先前的网络使用的接受野都是较大的。例如AlexNet的第一层使用的是11x11、步长为4的卷积核扫描。而VGGNet全部使用很小的3x3的卷积核(能表示上下左右最小的卷积核)、步长为1(没有信息的丢失)来扫描输入。由计算得,如果将两个这样的卷积核堆起来,和5x5的卷积核效果一样,如果是三个堆叠,其效果等同于7x7。

为什么要使用3个3x3卷积核堆叠代替一个7x7的卷积核?
1、层数越多,非线性因素就越多,决策函数的判别力更强。
2、通过这样做也可以减少参数。
假设输入是C个通道的3x3的矩阵,那么堆叠3次3x3的卷积网络的参数是3(3^2C^2)=27C^2而使用一个7x7的卷积核的参数是7^2C^2=49C^2。很明显,27 C^2小于49 C^2,即减少了参数;而且3x3卷积核有利于更好地保持图像性质。

经过卷积核后图片大小的计算(深度学习卷积操作的维度计算):
卷积核只改变图片的深度,不改变图片的宽度和高度。
卷积核的作用:图像处理时,给定输入图像,输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素,即最后feature map中的一个像素值。

例:输入:224x224x3,然后对图像padding(p=1),经过conv3-64后,输出:224x224x64。

  

参考:深度学习卷积操作的维度计算

例如:输入数据是一个三维数据,带有通道数(输入数据第三个维度),使用了两个卷积核(滤波器)扫描得到两个二维图像,组成输出数据的两个通道。一个卷积核对一个三维数据,要求卷积核也是三维,且通道数和输入数据通道数一样。

经过最大池化层后图片大小的计算:
池化只改变图片的宽度和高度,不改变图片的深度。
原理:通过减小输入的大小来降低输出值的数量。
池化的作用:图像中的相邻像素倾向具有相似的值,因此通常卷积层相邻的输出像素也具有相似的值,这意味着卷积层输出中包含的大部分信息都是冗余的,池化层除去这些冗余信息。

例:输入:224x224x64,经过max-pool后,输出:112x112x64

表1-ConvNet配置:

表2-每个ConvNet配置的参数数量:

输入:在训练期间,ConvNets的输入是一个固定大小的224×224 RGB图像。

填充:卷积层输入的空间填充是为了在卷积后保持空间分辨率,即3×3 卷积层的填充为1个像素。

预处理:唯一预处理是从每个像素中减去在训练集上计算的平均RGB值。(使均值为0,好拟合)

卷积层:conv3-64:卷积核的大小kernel_size=3x3,步距stride=1,填充padding=1,卷积核的个数64。

VGG16-C中1x1卷积的作用:增加决策函数(decision function)的非线性,因为引入了非线性激活函数。

最大池化层:max-pool:尺寸2x2,步距stride=2。

全连接层:
FC-4096:dropout(对神经元进行失活,防止过拟合) +ReLU(激活函数),4096个神经元。
FC-1000:没有激活函数,使用soft-max对结果进行概率化,1000个通道(表示要分类的类别数)。

连接层实际就是卷积核大小为上层特征大小的卷积运算,卷积后的结果为一个节点,就对应全连接层的一个点。

假设最后一个卷积层的输出为7×7×512,连接此卷积层的全连接层为1×1×4096。
第一个FC-4096:如果将FC-4096这个全连接层转化为卷积层:
共有4096组滤波器,每组滤波器含有512个卷积核,每个卷积核的大小为7×7,则输出为1×1×4096。
第二个FC-4096:若后面再连接一个1×1×4096全连接层。则其对应的转换后的卷积层的参数为:
共有4096组滤波器,每组滤波器含有4096个卷积核,每个卷积核的大小为1×1,输出为1X1X4096。
相当于就是将特征组合起来进行4096个分类分数的计算,得分最高的就是划到的正确的类别。

而全连接层的坏处就在于其会破坏图像的空间结构,因此人们便开始用卷积层来“代替”全连接层,通常采用1×1的卷积核,这种不包含全连接的CNN成为全卷积神经网络(FCN)。

softmax层:
softmax 可以理解为归一化,如目前图片分类有一百种,那经过 softmax 层的输出就是一个一百维的向量。向量中的第一个值就是当前图片属于第一类的概率值,向量中的第二个值就是当前图片属于第二类的概率值…这一百维的向量之和为1。
softmax的输入层和输出层的维度是一样的,如果不一眼,就在输入至 softmax 层之前通过一层全连接层。
softmax 的公式如下:

总层数 = conv3 + FC,(max-pool和soft-max不计入总层数),例如VGG16-D层数 = 13 + 3 = 16。
卷积层和全连接层:带权重、带参数、可以学习的层。
max-pool和soft-max不带权重、不带参数、不计入总层数。
其中13层卷积层和5层池化层负责进行特征的提取,最后的3层全连接层负责完成分类任务。
浅层:边缘、形状、颜色、形状。中层:条纹、纹理。深层:抽象(眼睛、腿)。

VGG16-D网络图片像素值变化过程:
卷积—卷积—池化—卷积—卷积—池化—卷积—卷积—卷积—池化—卷积—卷积—卷积—池化—卷积—卷积—卷积—池化—FC—FC—FC—softmax。

每经过一组卷积层,图像深度增加一倍;每经过一个池化层,图像大小缩小一倍。

max-pool和FC之间使用Flatten()函数:将多维的像素展平成一维的像素。

------VGG实现分类------

分类训练:
首先,对A网络随机初始化进行训练,因为A网络比较浅。
然后,在训练更深层次的架构时,初始化前四个卷积层和最后三个全连接层(中间层随机初始化)。

随机初始化:从正态分布中抽取权重,平均值为零,偏差0.01。偏差初始化为零。
也可以使用Glorot&Bengio(2010)的随机初始化程序,在不进行预训练的情况下初始化权重。

为了获得固定大小的224×224 ConvNet输入图像,从重新缩放的训练图像中随机裁剪这些图像(每SGD迭代一次,每幅图像裁剪一次)。重新缩放训练图像(随机水平翻转和随机RGB颜色偏移)

单尺度训练(固定最短边长S):
使用较小的初始学习率0.01。
1、S=256,首先使用S=256训练网络。
2、S=384,为了加快S=384网络的训练速度,使用S=256预先训练的权重对其进行初始化。

多尺度训练(随机采样最短边长S):
其中每个训练图像通过从一定范围内随机采样S来单独重新缩放[Smin,Smax](Smin=256,Smax=512)。用S=384模型初始化多尺度训练模型。
初始学习率0.1,直到验证集上的性能停止提升,把学习率除以10。总共下降了三次,在74 epochs停止。
为什么收敛的更快:
1、小的卷积核和深的网络起到隐式正则化的效果。(各种防止过拟合的操作都可以叫正则化)
2、对某些层使用了权重的初始化策略,先训练浅模型,再把浅模型的权重用作预训练参数。

分类测试:
给定一个经过训练的ConvNet和一个输入图像。
首先,将其各向同性地重新缩放到预定义的最小图像侧,表示为Q(测试尺度)。
然后,在重新缩放的测试图像上密集应用网络。即,首先将完全连接的层转换为卷积层(第一个FC层转换为7×7卷积层,最后两个FC层转换为1×1卷积层)。然后将得到的完全卷积网络应用于整个(未裁剪的)图像。结果是一个类别分数图,通道数等于类别数,空间分辨率可变,具体取决于输入图像的大小。
最后,为了获得图像的固定大小的类分数向量,对类分数映射进行空间平均(最大池化)。还通过图像的水平翻转来扩充测试集;对原始图像和翻转图像的soft-max类后验概率进行平均,以获得图像的最终分数。

两种预测方法:
方法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存在重复计算带来的效率的问题。

分类实验:
数据集:ILSVRC-2012数据集(用于ILSVRC 2012–2014挑战赛),该数据集包括1000个类的图像,并分为三组:训练(130万个图像)、验证(5万个图像)和测试(10万个图像,没有类标签)。

分类性能使用两个度量标准进行评估:top-1和top-5错误率。

单尺度评价:
单尺度估计,在测试时,对于固定的S,取Q=S;对于可变的S,取Q=0.5 ( Smin+Smax)。
结论:深度增加,分类错误率降低。最深的模型E效果最好,S变动时效果会更好。用3x3卷积核的D比用1x1卷积核的C好。而且发现加了LRN层(2012AlexNet网络中的LRN)并没有什么效果。

多尺度评价:
多尺度估计,就是在测试时,将图像缩放到几个不同的尺度,即Q的取值有多个,再将每个尺度得到的结果取平均,得到最终的结果。对于固定的S,令Q={S-32,S,S+32};对于可变的S,令Q={Smin,0.5 ( Smin+Smax),Smax}。
结论:到VGG16后随着深度的增加分类错误率并没有降低。(2015ResNet解决VGG深度退化的问题)

表5-ConvNet评估技术比较
结论:将multi-crop和densely两种方法相结合会在一定程度上提升性能。

表6-多个ConvNet集成结果:
多个网络模型的结果相结合(后验概率求平均)得到最终的分类结果,显然,这会提升分类的准确率以及稳定性。
结论:把两个性能最好的结合达到的效果最好。

表7-与ILSVRC分类最新技术的比较:
GoogLeNet最好效果6.7,VGG改进后6.8。

------VGG实现定位------

定位是目标检测的特例。
localization是找到某个物体的检测框,detection是找到所有物体的检测框。

定位最后一层全连接层(边界框预测层):预测边界框位置,而不是分类数。
边界框由存储其中心坐标、宽度和高度的四维向量表示。

不定类回归SCR:所有类别共享一个框,4-D
特定类回归PCR:每个类别一个框,4000-D(因为数据集有1000个类)

损失函数:
分类:用多分类交叉熵损失函数
回归:用欧式距离作损失函数(生成输出连续的值),预测框的坐标和真实坐标做差再平方求和。

定位训练:
两个单尺度训练:S=256和S=384
初始学习率设置为0.01
最后一个全连接的层随机初始化并从头开始训练,其它层使用同分类模型的初始化训练。

测试方案:
方案1、假设分类都正确(图像中心送到分类)仅关注模型的回归定位能力。
方案2、真实的分类模型,全卷积(图像全部送进去)

定位实验:
先选出方案1的最优配置,然后把其中的参数用于方案2。

如果边界框预测与地面真值边界框的并集比大于0.5,则认为边界框预测是正确的。由此,可以生成混淆矩阵,算各种分类的指标。

表8-方案1的实验结果:
结论:特定类回归PCR比不定类回归SCR效果好。Fine-tuned所有层比只调整FC层要好。

表9-方案2(微调所有层,并采用PCR)的top-5错误率
结论:S和Q都变化时(多尺度)性能提升

表10-和以前的定位方法比较
结论:深度提升具有更强大的表示能力

ImageNet数据集上的预训练模型在其他数据集上的操作:

预训练的模型作为提取器,把小数据集上的图片喂到这个模型,获得特征向量,再用特征向量训练小数据集上的分类器。(VGG直接用于小数据集会出现过拟合,因为VGG的参数太多,表示太强)

------VGG在其他数据集上的泛化------

去掉最后一层softmax,在FC-4096输出4096-D,然后对得到的向量做一个L2归一化,用归一化的特征去训练线性SVM分类器。(4096的高维空间是线性可分的)

首先重新缩放图像,短边缩成Q,然后喂到全卷积网络。原来是4096-D,变成全卷积可以兼容多尺度图像,会得到2x2x4096-D的张量,对每个2x2求和或求平均值变成其代表值,从而生成4096-D图像特征。最后将图像水平翻转送到网络里,再求一个4096-D的图像特征,然后对这两个图像特征求平均。

输出特征向量操作:(不同数据集选不同的操作)
1、堆叠:可以兼容多尺度,维度过高,难拟合。
2、下采样:不可以兼容多尺度

表11-VOC-2007和VOC-2012上迁移学习的表现:
评价指标:mAP(20个不同置信度下的precision求均值)

表12- VOC-2012动作分类
结论:VGG模型用图像和参考框的效果最好。
单纯的扩大数据量Oquab模型效果并不好,对模型本身改进,提升它的上限。

VGGNet预训练模型:
Keras:https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3
Tensorflow:http://download.tensorflow.org/models/vgg_19_2016_08_28.tar.gz
PyTorch各种版本:https://chsasank.github.io/vision/_modules/torchvision/models/vgg.html
VGGNet代码:https://gist.github.com/baraldilorenzo/07d7802847aaad0a35d3
 

参考:

https://www.jianshu.com/p/5412d1dec69d

https://blog.csdn.net/zziahgf/article/details/79614822

VGG网络结构和代码详解_哔哩哔哩_bilibili

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值