一、背景介绍
VGG
全称是Visual Geometry Group
,因为是由Oxford
的Visual Geometry Group
提出的。AlexNet
问世之后,很多学者通过改进AlexNet
的网络结构来提高自己的准确率,主要有两个方向:小卷积核和多尺度。而VGG
的作者们则选择了另外一个方向,即加深网络深度。
二、网络架构
卷积网络的输入是224 * 224
的RGB
图像,整个网络的组成是非常格式化的,基本上都用的是3 * 3
的卷积核以及 2 * 2
的max pooling
,少部分网络加入了1 * 1
的卷积核。因为想要体现出“上下左右中”的概念,3*3
的卷积核已经是最小的尺寸了。
解释两个关键问题:
-
作者用的是多个
3 * 3
卷积叠加,而不是例如7 * 7
、11 * 11
的单个卷积,原因如下:-
3个
3 * 3
卷积叠加得到的理论感受野和一个7 * 7
卷积的理论感受野是相同的。详细解释可以参考深度学习面试题-感受野 - 因为每个卷积层后面都会跟着一个
ReLU
,3个3 * 3
卷积就会有3个ReLU
,但是一个7 * 7
卷积只有一个,所以这么做可以使得模型的非线性拟合能力更强。 -
减少了参数数量。假设3个
3*3
卷积的输入和输出都是C
个通道,那么参数数量为,而7 * 7
卷积的参数数量为。
-
3个
-
1 * 1
卷积的作用是什么?- 为了在不影响卷积层感受野的前提下,增加模型的非线性。
-
调整网络维度,如
mobilenet
使用1 * 1
卷积核来扩维,resnet
用其降维。不过这一条不是vgg
提出的。
下图是VGG16
的网络架构:
三、对比实验
首先放上作者用来做对比实验的六组网络。
简单介绍一下各组的区别:
- A:没啥特别的。
- A-LRN:加了
LRN
,这是AlexNet
里提出来的,不需要怎么了解,基本很少使用了。 - B:加了两个卷积层。
- C: 进一步叠加了3个卷积层,但是加的是
1 * 1
的kernel
。 - D:将C中
1 * 1
的卷积核替换成了3 * 3
的,即VGG16
。 - E:在D的基础上进一步叠加了3个
3*3
卷积层,即VGG19
。
3.1 Single-Scale Evalution
首先说明一下训练集里图像短边长度S
的设置,设置方式分为两种:
- 固定
S
:针对单尺寸图片进行训练。 -
Scale jittering
:即对图片采用不同的Scale
进行缩放,文中S
在之间随机选择,。
然后图片进行各向同性缩放(后面有解释),并裁剪出224 * 224
的区域。注意,这些是针对训练集图片的,但是Single Scale Evalution
是针对测试集图像的,测试集图像的短边被固定为单一尺寸Q
,比如Q = 256或者384
。
实验结果分析:
- A、B对比:
LRN
对网络性能提升没有帮助。 - 从A到E对比: 增加一定程度的网络深度可以提高网络精度,进一步地说,用小卷积核构建出更深的网络,比使用大卷积核的浅层网络要好。
- B、C对比:引入
1 * 1
卷积层可以提高网络精度。 - C、D对比: 有一定大小的感受野(3*3)可以更好地捕捉上下文语境。
- C\D\E的内部对比:针对训练集图像的
Scale jittering
也可以提升网络精度。
3.2 Multi-Scale Evalution
这里Multi-Scale
是指采用多个尺寸的测试图像,可以把这个表格和前面Single Scale
的表格进行对比,可以发现测试时对测试集的图像采用Scale jittering
也可以获得更好的精度。
3.3 Mulit-Crop Evalution
首先解释一下dense evalution
和multi-crop
:
-
dense evalution
:用卷积层代替全连接层,那么卷积网络就可以接受任意大小的图像作为输入。 以上图为例,假设输入图片大小是
14 * 14
,最后输出有C
个通道(等同于类别数),经过第一阶段的卷积和池化之后得到了5 * 5
的特征图。如果我们用传统的CNN
,那么这时候我们需要将特征图展平为一维向量,大小为(1, 25)
,然后加上一个全连接层(权重w
的大小为(25, C)
),就可以得到属于各类别的概率。但是我们可以用一个5 * 5
的卷积层来代替,得到输出为(1, 1, C)
,然后降维得到分类概率。 如果将全卷积网络的输入换成
16 * 16
的图像,结果如下图所示:那么最后会得到
2 * 2 * C
的输出,把每个通道里2 * 2
的特征图的每一点相加求平均(sum pooling
),就是图片属于某一类别的概率。看不懂的话可以去了解一下FCN
。 -
multi-crop
:这一种方式是将测试图片的短边缩放到不同大小Q
,然后在Q * Q
的图像上裁剪出多个图像,将这些图像作为CNN
(没有将全连接转化为卷积)的输入,经过网络计算之后得到每个裁剪图像的分类概率,相加取平均之后作为原始图像的分类概率。按我的理解,这种方式其实和上面的dense
很类似,上面输入任意大小的图像,不经过裁剪直接放到卷积层里,卷积核在原图或者特征图上的滑动就好像是在Crop
,只是更加密集(dense
)。
按照作者的观点,这两种方法的差别在于convolution boundary condition
不同:dense
由于不限制图片大小,可以利用像素点及其周围像素的信息(来自于卷积和池化),包含了一些上下文信息,增大了感受野,因此提高分类的准确度;而multi-crop
由于从图片上裁剪再输网络,需要对图像进行零填充,因此增加了噪声。
实验表明,两种方式结合在一起更好。然而我也不懂怎么把它们结合在一起。
3.4 ConvNet Fushion
这个融合貌似意思是分别跑了各个网络之后,得到各自每张图片的softmax
分类概率,然后取平均作为最后的结果,作者说因为不同网络的互补性,所以分类效果有提升。不太清楚这种测试思路在后面提出的网络中应用得怎么样了。
四、补充
4.1 各向同性缩放和各向异性缩放
各向同性缩放:也称为“等比缩放”,图像长边和短边缩放比例相同,这样就不会破坏原图的比例,便于对物体精准定位,对应图中上边的路线。Smin
被设置为256
,假设短边缩放了2倍到Smin
,那么长边也对应缩放两倍。
各向异性缩放:不考虑物体是否会发生形变,直接对图片进行暴力resize
,使得图像变为我们想要的尺寸,对应图中下边的路线。如图所示,直接将图片先放缩到256 * 256
,发生了肉眼可见的形变。