深度学习图像分类(二)——VGG论文理解

0. 写作目的

好记性不如烂笔头。这里只是笔者记录的过程,如果读者有时间的话,建议看英文论文。

1. 网络结构

1.1 为什么采用更小的卷积

主要思想是:将卷积核换成卷积核较小的。

例如: 5 * 5 的卷积的视野与 2个 3 * 3 的卷积视野相同。7 * 7 的卷积视野与 3 个 3 * 3 的卷积视野相同。

以1层 7 * 7的卷积换成 3层3 * 3的卷积为例进行说明:

i) 使用3层非线性来代替1层非线性,使得决策函数更具有可分性(原文)

    可以这样理解:增加了网络的非线性程度。

ii) 可以减少参数的量

如: 假设 输入和输出feature map 的channel 都是C,

则采用7 * 7的参数为:  7 * 7 * C * C = 49C*C

采用 3 个 3 * 3的参数为 (3 * 3 * C * C) * 3 = 27C*C

1.2 网络配置

VGG认为在AlextNet中的LRN 对降低test error 没有什么用处,而且会增加内存消耗和运行时间,因此去除LRN。

卷积时采用的是保持分辨率不变的卷积。激活函数是:ReLU.

下图中Net-D 和Net-E分别是我们平时所说的VGG16 和VGG19.

通过Net-A 和 Net-A-LRN对比,发现LRN不能降低test error,因此其他网络均未采用LRN。

在两个4096全连接层后加上Dropout( 0.5 ).

深度学习图像分类(二)——VGG论文理解_第1张图片

2. 训练时的细节

2.1 训练参数的设置

SGD with momentum(0.9) + batch_size(256) 

loss函数: multinomial logistic regression + L2( 5e - 4 )

初始learning rate: 1e-2, 当val set accuracy不再上升时,降低学习率(除以10)。

训练过程中,学习率降低了3次,大概74epoch左右(370K iterations)停止训练。

训练时,224 * 224的RGB图像,preprocess是 减去训练集的 mean RGB value.

权重的初始化的trick:

i) 均值为0,方差为1e-2的正态分布, biases初始为0.

ii) 先对Net-A进行训练,然后对后面的网络如Net-B,Net-C,Net-D训练时,将Net-A的权重赋给Net-B,Net-C,Net-D,其他不同的层,采用i)中的随机初始化方式。

作者在文章给出:不使用ii)中的方式也可以,可以采用文献[2]的方法。即大部分网络都在使用的初始化方法: Xavier初始化。

2.2 训练时图像的增广

首先对图像进行随机水平翻转 和 随机RGB color shift(与AlexNet类似),

然后进行Crop (One Crop per image per SGD iteration)。

2.3 训练时图像的大小

先将图像缩放到某一尺度,然后进行2.2中的操作

i) 使用固定 尺度

缩放到S = 256 或者S = 384,然后进行2.2中的图像增广。

为了加速S = 384的训练,在S=256的权重上进行调整, 学习率设为1e-3.

ii) 多尺度

训练的时候随机选择S, S 在 256 和512之间选择。

同时,为了加速训练,采用S = 384的权重。

3. 测试阶段细节--Dense evaluation(即Fully-Convolutionla Net)

测试的时候,将全连接层转为全卷积层,first FC layer to 7 * 7 conv(因为原网络的卷积层在全连接层的前一层即为7*7*512,所以可以将FC层看成特殊的全卷积), last two FC layers to 1 * 1 conv。对于测试图像,不进行crop,而是将全图送入网络中。最后一层的输出的深度就是class类别的数目。但是由于输出图像的尺寸可能不是224 * 224,因此这种测试方法,得到的可能是一个m * n * 1000的结果,因此需要对每一个channle进行求平均。

测试阶段,对测试图像进行水平镜像,然后将原图和水平镜像的图像求平均值。

由于采样全卷积,不要进行Crop,但文献[4]指出(GoogleNet),using a large set of crops,能提高性能。而且,multi-crop 是对dense evaluation 的一个补充: 当将Crop后的图像送入网络中,卷积得到的feature maps是由0填充边界得到的,然而在dense evaluation中,同样的填充是由图像的周围的像素填充的。这样(Crop的方法)实际上增加了网络的感受野,所以更多的上下文被捕捉到。但是作者指出,在实际中,采用multi-crop增加了运行时间,也不一定能保证提高acc。为了参考,作者进行了crop 的实验,每个scale进行50个crop(5 * 5 regular grid with 2 flips),3个scale,共150个crops.

对比实验在4.3的 multi-crop中。

 

4. ILSVRC实验结论(分类)

数据集:1000类别   train 1.3M images  validation: 50K images,   test: 100K images

4.1 single scale evlauation

深度学习图像分类(二)——VGG论文理解_第2张图片

结论:

i) Net-A-LRN 不能提高网络的性能,因此后面的网络不使用LRN.

ii) 深度越深,性能越好。

    尽管Net-C 比Net-B好,说明在Net-C中添加的1*1的卷积有用,但是比较Net-C和Net-D,说明相对1*1的卷积,3*3的卷积能捕捉到空间信息(spatial context)。对于VGG的网络,在这里到19层(只包括卷积核全连接层)就饱和了,但更深的网络可能对更大的数据有用。

作者通过Net-B,进行实验,将其中的2个3*3卷积换成1个5*5的卷积,但是top-1 test error高了7%,进一步说明了小卷积核的有效。

iii)在单尺度测试时,在多尺度上训练的网络要比在单尺度上训练的网络性能好。这证明了scale jittering 对捕捉多尺度的图像统计信息有效。

4.2 Multi-Scale Evaluation

对于single-scale训练的模型,采用多尺度测试,即{S-32, S, S + 32},其中S为训练时的尺度。

对于Multi-scale训练的模型,多尺度测试为:{Smin, 0.5(Smin + Smax), Smax},其中Smin = 256, Smax = 512.

深度学习图像分类(二)——VGG论文理解_第3张图片

结论:

i) 测试阶段使用scale jittering能提高性能(与使用单尺度相比)。

 ii) Net-D(VGG16)和 Net-E(VGG19)能达到很好的效果。scale jittering train比single scale train要好。

4.3 Multi-Crop evaluation

深度学习图像分类(二)——VGG论文理解_第4张图片

结论:

i) multi-crop evaluation  要比dense evaluation(即Fully Convoluational Net) top-1 好一些。

ii) 二者结合(求平均值在softmax层)效果更好。

4.4 ConvNet Fusion(模型融合)

结论:模型融合确实有效。

深度学习图像分类(二)——VGG论文理解_第5张图片

There may be some mistakes in this blog. So, any suggestions and comments are welcome!

[Reference]

[1] VGG parper: https://arxiv.org/abs/1409.1556

[2] Xavier paper:https://blog.csdn.net/victoriaw/article/details/73000632

[3] Xavier 理解: https://blog.csdn.net/victoriaw/article/details/73000632

[4] Crop提高测试性能 paper(GoogleNet):https://arxiv.org/abs/1409.4842

 

 

你可能感兴趣的:(深度学习,图像分类,Classification)