好记性不如烂笔头。这里只是笔者记录的过程,如果读者有时间的话,建议看英文论文。
主要思想是:将卷积核换成卷积核较小的。
例如: 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
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 ).
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初始化。
首先对图像进行随机水平翻转 和 随机RGB color shift(与AlexNet类似),
然后进行Crop (One Crop per image per SGD iteration)。
先将图像缩放到某一尺度,然后进行2.2中的操作
i) 使用固定 尺度
缩放到S = 256 或者S = 384,然后进行2.2中的图像增广。
为了加速S = 384的训练,在S=256的权重上进行调整, 学习率设为1e-3.
ii) 多尺度
训练的时候随机选择S, S 在 256 和512之间选择。
同时,为了加速训练,采用S = 384的权重。
测试的时候,将全连接层转为全卷积层,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中。
数据集:1000类别 train 1.3M images validation: 50K images, test: 100K images
结论:
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 对捕捉多尺度的图像统计信息有效。
对于single-scale训练的模型,采用多尺度测试,即{S-32, S, S + 32},其中S为训练时的尺度。
对于Multi-scale训练的模型,多尺度测试为:{Smin, 0.5(Smin + Smax), Smax},其中Smin = 256, Smax = 512.
结论:
i) 测试阶段使用scale jittering能提高性能(与使用单尺度相比)。
ii) Net-D(VGG16)和 Net-E(VGG19)能达到很好的效果。scale jittering train比single scale train要好。
结论:
i) multi-crop evaluation 要比dense evaluation(即Fully Convoluational Net) top-1 好一些。
ii) 二者结合(求平均值在softmax层)效果更好。
结论:模型融合确实有效。
There may be some mistakes in this blog. So, any suggestions and comments are welcome!
[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