VGG

1、总体的体系结构

训练阶段,输入为固定的224x224的RGB图像。唯一做的预处理是对每个像素减去训练集中的RGB均值。卷积核使用3x3,在我们的一种配置中也有使用1x1的情况,这可以看作是对输入通道的一个线性变换(其后面接一个非线性变换)。步长固定为一像素。padding用来保持卷积后图像的原来大小分辨率。空间池化包含五个最大池化层,它们接在部分卷积层的后面,(并不是所有卷积层都接有最大池化层)。最大池化层为2x2的滑动窗口,滑动步长为2。在一整堆卷积层后接了三个全连接层,前两个全连接层各有4096个通道,第三个在用来做1000类的ILSVRC分类,因此包含1000个通道(每个通道代表一类)。最后一层是一个soft-max层。全连接层的配置在所有的网络中一致。 所有隐层都是使用非线性修正(ReLu)。

—————————————————————————————————————————————————

padding用来保持卷积后图像的原来大小分辨率,为什么需要保持卷积后图像和原图像大小一致??

卷积操作存在两个问题
1、图像越来越小;
2、图像边界信息丢失,即有些图像角落和边界的信息发挥作用较少。
因此需要padding

—————————————————————————————————————————————————

2、网络具体配置

接下来我们将按网站名称(A-E)来提及网络。所有配置都遵循刚才提出的通用设计,并且仅是深度不同:从网络A中的11个加权层(8个卷积层和3个FC层)到网络E中的19个加权层(16个卷积层和3个FC层)。卷积层的宽度(通道数)相当小,从第一层中的64开始,然后在每个最大池化层之后增加2倍,直到达到512。
具体如图:
VGG
VGG

不同结构

VGG一共提供了6个网络版本,一次探究不同网络的效果对比。下面简要分析一下各个版本的网络配置细节
结构 A:与 AlexNet 类似,卷积层分为5个stage,3个全连接层,不同的是,卷积层用的都是3x3大小的卷积核;
结构 A-LRN:保留 AlexNet 中的 LRN 操作,其他结构与A相同;
结构 B:在 A 的 stage2 和 stage3 分别增加一个3x3的卷积层,共有10个卷积层了;
结构C:在 B 的基础上,stage3,stage4,stage5 分别增加一个1x1的卷积层,有13个卷积层,总计16层;
结构D:在 C 的基础上,stage3,stage4,stage5 分别增加一个3x3的卷积层,有13个卷积层,总计16层;
结构E:在 D 的基础上,stage3,stage4,stage5 分别再增加一个3x3的卷积层,有16个卷积层,总计19层。

全连接层

特征图的宽高从512后开始进入全连接层,因为全连接层相比卷积层更考虑全局信息,将原本有局部信息的特征图(既有width,height还有channel)全部映射到4096维度。也就是说全连接层前是7x7x512维度的特征图,估算大概是25000,这个全连接过程要将25000映射到4096,大概是5000,换句话说全连接要将信息压缩到原来的五分之一。VGGNet有三个全连接,【我】的理解是作者认为这个映射过程的学习要慢点来,太快不易于捕捉特征映射来去之间的细微变化,让backprop学的更慢更细一些(更逐渐)

换句话说,维度在最后一个卷积后达到7x7x512,即大概25000,紧接着压缩到4096维,可能是作者认为这个过程太急,又接一个fc4096作为缓冲,同时两个fc4096后的relu又接dropout0.5去过渡这个过程,因为最后即将给1k-way softmax,所以又接了一个fc1000去降低softmax的学习压力。

feature map维度的整体变化过程是:先将local信息压缩,并分摊到channel层级,然后无视channel和local,通过fc这个变换再进一步压缩为稠密的feature map,这样对于分类器而言有好处也有坏处,好处是将local信息隐藏于/压缩到feature map中,坏处是信息压缩都是有损失的,相当于local信息被破坏了(分类器没有考虑到,其实对于图像任务而言,单张feature map上的local信息还是有用的)。

softmax层(最后一层用于分类)

https://www.cnblogs.com/alexanderkun/p/8098781.html

3、训练和测试:

指标:
ImageNet 图像分类大赛评价标准采用 top-5 错误率,或者top-1错误率,即对一张图像预测5个类别,只要有一个和人工标注类别相同就算对,否则算错。
Top-1 = (正确标记 与 模型输出的最佳标记不同的样本数)/ 总样本数;
Top-5 = (正确标记 不在 模型输出的前5个最佳标记中的样本数)/ 总样本数;
top1-----就是你预测的label取最后概率向量里面最大的那一个作为预测结果,如过你的预测结果中概率最大的那个分类正确,则预测正确。否则预测错误
top5-----就是最后概率向量最大的前五名中,只要出现了正确概率即为预测正确。否则预测错误。

训练使用的是带有动量的mini-batch梯度下降的方法,batch大小为256,动量设置为0.9,训练正则项所乘的参数设置为5*10-4(10的-4次方),dropout率设置为0.5,learning rate设置为10的-2次方。实验训练了370k次(74个epochs)。
论文提到网络权重的初始化很重要,初始化不好了可能会让学习停止。论文是这样做的,先对A网络进行随机初始化参数进行训练,然后,将训练好的A网络的参数去初始化后边深层网络的前4层以及全连接层,剩下的层是用均值为0,方差为0.01的正态分布去随机初始化的,并且biases初始化为0。并且论文里提到,可能存在不需要预训练参数直接进行初始化参数的方法,需要进一步探索。

为了获得224x224的输入图像,论文里是对原图进行各向同性的放缩后,采取随机裁剪的方式获得的,使用S代表放缩后的图像的最短边,所以S>=224,为了扩充数据集,裁剪后的图像进行了随机的水平翻转以及随机的RGB颜色转换。
同时呢,论文的还采用了多种尺度的训练方式,就是将原始图片采用不同的S放缩后进行裁剪训练,比如让S=256,S=384分别训练,还有一种动态改变S的方式,就是给定S的范围[Smin,Smax],让每张训练图片随机选取S进行训练,这样相当于通过尺度抖动来增强数据。

训练图像尺寸选择
S是训练图像的最小边。训练尺度
Q是测试图像的最小边。测试尺度
对原始图片进行等比例缩放,使得S大于224,然后在图片上随机提取224x224窗口,进行训练。
单一尺度训练:固定 S 的大小,对应了单一尺度的训练,训练多个分类器。训练S=256和S=384两个分类器,其中S=384的分类器用S=256的权重进行初始化;
多尺度(Multi-scale)训练(尺度抖动):直接训练一个分类器,每次数据输入的时候,每张图片被重新缩放,缩放的短边S随机从[256,512]中选择一个,也可以认为通过尺度抖动(scale jittering)进行训练集增强。图像中的目标可能具有不同的大小,所以训练时认为这是有用的。

3.1 、单尺度评估

首先将训练图像缩放到最小边长度的方形,设缩放后的训练图像的尺寸为S×S。网络训练时对训练图像进行随机裁剪,裁剪尺寸为网络的输入尺寸224×224。如果S=224,则输入网络的图像就是整个训练图像;如果S>224,则随机裁剪训练图像包含目标的部分。
VGG
各结构效果对比分析
A 与 A-LRN 比较:A-LRN 结果没有 A 好,说明 LRN 作用不大;
A 与 B, C, D, E 比较:A 是这当中层数最少的,相比之下 A 效果不如 B,C,D,E,说明层数越深越好;
B 与 C 比较:增加 1x1 卷积核,增加了额外的非线性提升效果;
C与D比较:3x3 的卷积核(结构D)比 1x1(结构C)的效果好。尽管深度相同,配置C(包含三个1×1卷积层)比在整个网络层中使用3×3卷积的配置D更差。这表明,虽然额外的非线性确实有帮助(C优于B),但也可以通过使用具有非平凡感受野(D比C好)的卷积滤波器来捕获空间上下文。1x1的卷积也是很有效的,但是没有3x3的卷积好,大一些的卷积核可以学习更大的空间特征。
我们还将网络B与具有5×5卷积层的浅层网络进行了比较,浅层网络可以通过用单个5×5卷积层替换B中每对3×3卷积层得到。测量的浅层网络top-1错误率比网络B的top-1错误率(在中心裁剪图像上)高7%,这证实了具有小滤波器的深层网络优于具有较大滤波器的浅层网络。
训练时的尺寸抖动(训练图像大小S∈[256,512]S∈[256,512])得到的结果好于固定尺寸,这证实了通过尺度抖动进行的训练集增强确实有助于捕获多尺度图像统计。

3.2、多尺度评估

对同一张测试图像,将其缩放到不同的尺寸进行测试,然后取这几个测试结果的平均值,作为最终的结果(有点像集成学习,所不同的是,这里是测试图像的尺寸不同)。使用了三种尺寸的测试图像:Q表示测试图像,S表示训练是图像尺寸:Q=S−32;Q=S+32,前面两种是针对训练图像是固定大小的,对于训练时图像尺寸在一定范围内抖动的,则可以使用更大的测试图像尺寸。Q={Smin,0.5(Smin+Smax),Smax}Q={Smin,0.5(Smin+Smax),Smax}.
VGG
效果分析
训练图像尺度抖动优于使用固定最小边S
最后,训练时的尺度抖动得到了与固定最小边(或)的图像训练相比更好的结果,即使在测试时使用单尺度。这证实了通过尺度抖动进行的训练集增强确实有助于捕获多尺度图像统计。

在训练时,可以使用多尺度抖动的训练图像,其精度好于固定尺寸的训练集。

3.3、稠密和多裁剪图像评估

Dense(密集评估),即指全连接层替换为卷积层(第一FC层转换到7×7卷积层,最后两个FC层转换到1×1卷积层)
最后得出一个预测的score map,再对结果求平均。
测试方法首先将网络转化为全卷积网络,第一个全连接层转为7×7的卷积层,后两个全连接层转化为1×1的卷积层。
结果得到的是一个N×N×M的结果,称其为类别分数图,其中M等于类别个数,N的大小取决于输入图像尺寸Q,
计算每个类别的最终得分时,将N×N上的值求平均,此时得到1×1×M的结果,此结果即为最终类别分数,这种方法文中称为密集评估。

全卷积层后面仔细介绍

multi-crop,即对图像进行多样本的随机裁剪,将得到多张裁剪得到的图像输入到网络中,最终对所有结果平均。
这种测试方法,和训练过程类似,不用将网络转化为全卷积网络,是从Q×Q大小的图中随机裁剪224×224的图作为输入,
文中裁剪了50个图像,而每个图像之前缩放为三个尺寸,所以每个图像的测试图像数目变为150个,最终结果就是在150个结果中取平均。
但是作者指出,该方法效率低下,并且不能证明比第一种方法效果好。

ConvNet评估技术比较。在所有的实验中训练尺度S从[256;512]采样,三个测试适度Q考虑:{256, 384, 512}
VGG
在上表中,我们将稠密ConvNet评估与多裁剪图像评估进行比较。我们还通过平均其softmax输出来评估两种评估技术的互补性。可以看出,使用多裁剪图像表现比密集评估略好,而且这两种方法确实是互补的,因为它们的组合优于其中的每一种。

multi-crops(随机裁剪)相当于对于dense evaluatio(稠密)的补充,原因在于,两者在边界的处理方式不同:multi-crop相当于padding补充0值,而dense evaluation相当于padding补充了相邻的像素值,并且增大了感受野,因此捕获了更多的图像内容信息。
multi-crop存在重复计算带来的效率的问题

由于不同的卷积边界条件,多裁剪图像评估是密集评估的补充:当将ConvNet应用于裁剪图像时,卷积特征图用零填充,而在密集评估的情况下,相同裁剪图像的填充自然会来自于图像的相邻部分(由于卷积和空间池化),这大大增加了整个网络的感受野,因此捕获了更多的图像内容信息。multi-crop存在重复计算带来的效率的问题

虽然我们认为在实践中,多裁剪图像的计算时间增加并不足以证明准确性的潜在收益。但使用大量的裁剪图像可以提高准确度,因为与全卷积网络相比,它使输入图像的采样更精细。

除此之外,本文还采取了全卷机网络和随机裁剪相结合的方法,即两者结果取平均。其能大大增加网络的感受野,因此捕获更多的上下文信息,实验中也发现这种方法表现最好。

在训练时,可以使用多尺度抖动的训练图像,其精度好于固定尺寸的训练集。
测试时,使用多裁剪和密集评估(卷积层替换全连接层)像结合的方法

4、VGG优势

(1)使用了更小的3*3卷积核,和更深的网络。
两个3x3卷积核的堆叠相对于5x5卷积核的视野,三个3x3卷积核的堆叠相当于7x7卷积核的视野。这样一方面可以有更少的参数(3个堆叠的3x3结构只有7x7结构参数数量的(3x3x3)/(7x7)=55%);另一方面拥有更多的非线性变换,增加了CNN对特征的学习能力。

小卷积核

说到网络深度,这里就不得不提到卷积,虽然AlexNet有使用了11x11和5x5的大卷积,但大多数还是3x3卷积,对于stride=4的11x11的大卷积核,我认为在于一开始原图的尺寸很大因而冗余,最为原始的纹理细节的特征变化用大卷积核尽早捕捉到,后面的更深的层数害怕会丢失掉较大局部范围内的特征相关性,后面转而使用更多3x3的小卷积核(和一个5x5卷积)去捕捉细节变化

而VGGNet则清一色使用3x3卷积。因为卷积不仅涉及到计算量,还影响到感受野。前者关系到是否方便部署到移动端、是否能满足实时处理、是否易于训练等,后者关系到参数更新、特征图的大小、特征是否提取的足够多、模型的复杂度和参数量等等。

计算量

在计算量这里,为了突出小卷积核的优势,我拿同样conv3x3、conv5x5、conv7x7、conv9x9和conv11x11,在224x224x3的RGB图上(设置pad=1,stride=4,output_channel=96)做卷积,卷积层的参数规模和得到的feature map的大小如下:
VGG
从上表可以看出,大卷积核带来的特征图和卷积核得参数量并不大,无论是单独去看卷积核参数或者特征图参数,不同kernel大小下这二者加和的结构都是30万的参数量,也就是说,无论大的卷积核还是小的,对参数量来说影响不大甚至持平。

增大的反而是卷积的计算量,在表格中列出了计算量的公式,最后要乘以2,代表乘加操作。为了尽可能证一致,这里所有卷积核使用的stride均为4,可以看到,conv3x3、conv5x5、conv7x7、conv9x9、conv11x11的计算规模依次为:1600万,4500万,1.4亿、2亿,这种规模下的卷积,虽然参数量增长不大,但是计算量是惊人的。

总结一下,我们可以得出两个结论
同样stride下,不同卷积核大小的特征图和卷积参数差别不大;
越大的卷积核计算量越大。
但一个关键的点——多个小卷积核的堆叠比单一大卷积核带来了精度提升,这也是最重要的一点。

感受野

https://blog.****.net/weixin_43384257/article/details/90664965
两个3x3的卷积堆叠获得的感受野大小,相当一个5x5的卷积;而3个3x3卷积的堆叠获取到的感受野相当于一个7x7的卷积。

小池化核

这里的“小”是相对于AlexNet的3x3的池化核来说的。2012年的AlexNet,其pooling的kernel size全是奇数,里面所有池化采用kernel size为3x3,stride为2的max-pooling。而VGGNet所使用的max-pooling的kernel size均为2x2,stride为2的max-pooling。pooling kernel size从奇数变为偶数。小kernel带来的是更细节的信息捕获。
在当时也有average pooling,但是在图像任务上max-pooling的效果更胜一筹,所以图像大多使用max-pooling。在这里我认为max-pooling更容易捕捉图像上的变化,梯度的变化,带来更大的局部信息差异性,更好地描述边缘、纹理等构成语义的细节信息,这点尤其体现在网络可视化上。

(2)在VGGNet的卷积结构中,引入1*1的卷积核,在不影响输入输出维度的情况下,引入非线性变换,增加网络的表达能力,降低计算量。
B 与 C 比较:增加 1x1 卷积核,增加了额外的非线性提升效果;

(3)全卷积层
这也是VGG的一个特点,在网络测试阶段将训练阶段的三个全连接替换为三个卷积,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入,这在测试阶段很重要。

首先需要理解的是改fc层为conv层实际上的计算方式没有发生任何变化。但是其结果全卷积网络可以接收任意大小的图片输入,得到一个score map,对其做一个average就可以得到最终结果(one-hot label)。之所以需要这样设计,因为他们train与test的图片大小是不一样的。
首先解释方便,对于384384的图片,不修改AlexNet的结构使之适应384384(依然使用原来224x224输入的结构),直到经过汇聚层得到[12x12x512]的数组时,网络运行没有任何问题,按照原来的架构,接下来要将特征图平铺和4096个神经元全连接,这时候就出问题了,因为原架构平铺后是7x7,现在是12x12,无法使用之前的参数矩阵了,但是将全连接层转化为卷积层后可继续进行,并最终得到6x6的正确输出,仅仅将网络的全连接层等价转化为卷积层,就能接收更大的图片,这显然方便了很多。

比如VGGNet[1]中, 第一个全连接层的输入是7x7x512, 输出是4096. 这可以用一个卷积核大小7x7, 步长(stride)为1, 没有填补(padding), 输出通道数4096的卷积层等效表示, 其输出为1x1x4096, 和全连接层等价. 后续的全连接层可以用1x1卷积等效替代.

比如训练时对224x224大小的图像得到7x7x512的特征, 而对于384x384大小的测试图像, 将得到12x12x512的特征,== 原来训练时==第一个全连接层的参数个数是:7x7x512展开 再乘以4096个节点个权重,现在利用卷积核7x7x512x4096还是原来哪些参数,只不过变成了卷积核,大小为7x7x512一共4096个,这样会的到大小为(12-7)/1+1=6,6x6大小的特征值矩阵,一共4096个,再通过过滤器大小为1x1x4096的过滤器4096个,得到6x6大小的过滤器4096个,在通过1x1x4096的过滤器1000个。通过后面3个从全连接层等效过来的卷积层, 输出大小是6x6大小,再对结果求平均,一共1000个

(4)训练时,先训练级别简单(层数较浅)的VGGNet的A级网络,然后使用A网络的权重来初始化后面的复杂模型,加快训练的收敛速度。

(5)采用了Multi-Scale的方法来训练和预测。可以增加训练的数据量,防止模型过拟合,提升预测准确率 。

参考:
论文解读
VGG优势
计算量、小卷积核、小池化层、感受野、全连接
ABCDE不同结构对比
训练
全卷积、训练、测试
VGG网络中测试时为什么全链接层改成卷积层