VGGNet是在ImageNet Challenge 2014在定位和分类过程中分别获得了第一名和第二名的神经网络架构。VGGNet是牛津大学计算机视觉组和DeepMind公司的研究员一起研发的深度卷积神经网络。VGG主要探究了卷积神经网络的深度和其性能之间的关系,通过反复堆叠3×3的小卷积核和2×2的最大池化层,VGGNet成功的搭建了16-19层的深度卷积神经网络。与之前的网络结构相比,错误率大幅度下降;同时,VGG的泛化能力非常好,在不同的图片数据集上都有良好的表现。到目前为止,VGG依然经常被用来提取特征图像。自从2012年AlexNet在ImageNet Challenge大获成功之后,深度学习在人工智能领域再次火热起来,很多模型在此基础上做了大量尝试和改进。主要有两个方向:
1.使用尺寸更小的3x3卷积核串联来获得更大的感受野,放弃使用11x11和5x5这样的大尺寸卷积核:
在VGG中,使用了3个3x3卷积核来代替7x7卷积核,使用了2个3x3卷积核来代替5*5卷积核,这样做的主要目的是在保证具有相同感知野的条件下,提升了网络的深度,在一定程度上提升了神经网络的效果。因为在3个3×3卷积核串联后的的感受野与7×7卷积的感受野是一样的,但是3×3卷积可以得到更多的细节,7×7卷积会忽略一些细节。7×7卷积只是用一次变换就得到某个区域的特征,而3×3卷积是用了三次变换得到某个区域的感受野,这个三次3×3卷积非线性能力更强,那么他的描述能力就更强,他就能学习到更复杂的特征。
2.深度更深、非线性更强,网络的参数也更少 :
使用小卷积核串联构建的网络深度更深、非线性更强、参数也更少。
使用3个3 × 3的卷积:3 × 3 × × × 3 = 27²
使用1个7 × 7的卷积:7 × 7 × × = 49²
3个3 × 3的卷积相比1个7 × 7的卷积参数量少了一半!
3. 去掉了AlexNet中的局部响应归一化层(LRN)层。
VGG16
VGGNet的图片预处理
VGG的输入224*224的RGB图像,预处理就是每一个像素减去了所有像素的均值。
data Data
include
phase: train
transform param
mirror: true
crop size: 224
mean value: 103.939, 116.779, 123.68
data param
source:
data/ilsvrc12 shrt 256/ilsvrc12 ftrain_ leveldb
batch size: 64
backend: leveldb
blob shapes
data: [1, 3, 224, 224 ]
labe:[ 1 ]
输入图像经过两个卷积层,也就是VGG16网络结构十六层当中的第一层(CONV1-1)和第二层(CONV1-2),合称为CONV1。将224x224x3的输入矩阵变成一个224x224x64的矩阵。
CONV1: 64 个3x3 卷积核,步长为 1,padding设置为1
conv1 Convolution
param
Ir mult: 1
decay mult: 1
Ir mult: 2
decay mult: 0
convolution param
num output: 64
pad: 1
kernel size: 3
weight fller
type: gaussian
std: 0.01
bias fller
type: constant
value: 0
blob shapes
conv1 1:[1, 64, 224, 224]
relu1_ 1 ReLU InPlace
blob shapes
conv1 1:[1, 64, 224, 224]
第二层 (POOL1):池化大小为 2x2,步长为 2,那么得到的矩阵维数刚好为原来的一半
我们从上面的过程中知道了,input为300x300x3的图片,经过第一层之后变成150x150x64,那么第二层里面有128个卷积核,可以推出经过第二层后得到是75x75x128。
CONV2层 (2层卷积): 2个128 通道3x3 卷积核,步长为 1,padding设置为1
POOL2层 :池化大小为 2x2,步长为 2
CONV3层 (3层卷积): 3个256 通道的3x3 卷积核,步长为 1,padding设置为1
POOL3层 :池化大小为 2x2,步长为 2
CONV4层 (3层卷积): 3个512 通道的3x3 卷积核,步长为 1,padding设置为1
POOL4层 :池化大小为 2x2,步长为 2
CONV5层 (3层卷积): 3个512 通道的3x3 卷积核,步长为 1,padding设置为1
5. 输入:14x14x512 大小的图像
6. 尺寸:(14-3+2×1)/1+1 = 14
7. 卷积层通道数:512
8. 输出尺寸:14×14×512
POOL4层 :池化大小为 2x2,步长为 2
9. 输入:14×14×512 大小的图像
10. 尺寸:(14-2)/2+1 =7
11. 池化层个数:512
12. 输出尺寸:7x7x512
进入全连接层之前是7x7x512的张量,通过flatten展平后编程25088维的向量,通过fc6全连接层输出后编程4096维的向量,通过去fc7全连接层输出后变成4096维的向量,之后通过 fc8全连接层输出后变成1000维的向量(ImageNet中的类别数量)
VGGNet使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224′224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。实践中,作者令S在[256,512]这个区间内取值,使用Multi-Scale获得多个版本的数据,并将多个版本的数据合在一起进行训练。VGG作者在尝试使用LRN之后认为LRN的作用不大,还导致了内存消耗和计算时间增加。
虽然网络层数加深,但VGG在训练的过程中比AlexNet收敛的要快一些,主要因为: