CS231n: Convolutional Neural Networks for Visual Recognition Lecture 9 CNN Architecture 笔记总结
主要根据ILSVRC(ImageNet Large Scale Visual Recognition Challenge)历届冠军论文,把经典的CNN Architecture做了整理,其中有加入个人理解,如有错误,请积极指出。
课程内容非常好,讲解很细致,推荐。
Preview
总结一下卷积层的性质(其中两个公式要牢记,之后会用到):
- 输入数据体的尺寸为 W1∗H1∗D1 W 1 ∗ H 1 ∗ D 1
- 四个超参数:
- 滤波器的数量K
- 滤波器的空间尺寸F*F
- 步长S
- 零填充数量P
- 输出数据体的尺寸为
W2∗H2∗D2
W
2
∗
H
2
∗
D
2
,其中
- W2=(W1−F+2P)/S+1 W 2 = ( W 1 − F + 2 P ) / S + 1
- H2=(H1−F+2P)/S+1 H 2 = ( H 1 − F + 2 P ) / S + 1 (宽度与高度计算方法相同)
- D2=K D 2 = K
- P=(F−S)/2 P = ( F − S ) / 2 (保证输入和输出尺寸相同)
- 由于参数共享,每个滤波器包含 F∗F∗D1 F ∗ F ∗ D 1 个权重,卷积层一共有 F∗F∗D1∗K F ∗ F ∗ D 1 ∗ K 个权重和 K K 个偏置。
- 在输出中,第个深度切片(空间尺寸是 W2∗H2 W 2 ∗ H 2 ),用第 d d 个滤波器和输入数据进行有效卷积运算的结果(使用步长S),最后再加上第个偏差。
Case study: LeNet-5
【LeCun et al., 1998】
1998年,LeCun提出基于梯度学习的卷积神经网络算法,并将其成功用于手写数字字符识别(mnist数据集),LeNet模型并没有参与ILSVRC比赛,但它是卷积神经网络的开山之作。
LeNet-5的网络结构非常简单,是一个7层的网络(不包括输入层),其深度为5,有3个卷积层,2个池化层,2个全连接层。
网络结构特点如下:
C1、C3、C5三个卷积层使用的Kernel大小全部都是5*5,并且步长为1。
输入图像尺寸统一归一化为32x32。
S2和S4两个池化层(或者说是下采样层)使用的window大小均为2x2,步长为2,采样方式是4个输入相加,乘以一个可训练参数,再加上一个可训练偏置,结果通过sigmoid。(即不是max pooling,也不是average pooling)
F6全连接层,输出大小为84,这一层输出经过了非线性函数sigmoid。
F7是输出层,也是全连接层,共有10个节点,分别表示数字0-9,采用欧式径向基函数(Euclidean Radial Basis Function,RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:
(注:这部分写的不清楚,需要再看看)
LeNet是最早的卷积神经网络结构,它开创了卷积神经网络的基本结构[CONV-POOL-CONV-POOL-FC-FC]。但由于计算资源限制和数据获取瓶颈,卷积神经网络发展停滞,沉寂多年。
Case study:AlexNet
【Krizhevsky et al. 2012】
AlexNet是2012年ILSVRC的冠军,且准确率远超第二名(AlexNet top5 error rate 15.3%,第二年为26.2%)。
AlexNet深度为8,有5个卷积层,3个池化层,2个归一化层,及3个全连接层。总结构如图。[CONV1-MAX POOL1-NORM1-CONV2-MAX POOL2-NORM2-CONV3-CONV4-CONV5-MAX POOL3-FC6-FC7-FC8]
输入:227x227x3 images(图中以及论文写的是224,作者应该是忘了说加上了3个zero-padding)
First layer(CONV1):96个卷积核,大小为11x11,步长为4
输出数据体大小:套用计算公式,(227-11)/4+1=55,所以输出数据体大小是[55x55x96]
这一层的参数量: (11∗11∗3)∗96=35K ( 11 ∗ 11 ∗ 3 ) ∗ 96 = 35 K
Second layer (POOL1):3x3大小的window,步长为2
输出数据体大小:套用计算公式,(55-3)/2+1=27,所以输出数据体大小是[27x27x96]
这一层的参数量:0!(池化层没有参数)
其余各层计算相同,得到以下结果:
其他细节及创新点:
- 第一次使用ReLU非线性激活代替tanh和sigmoid,加快训练速度。
- 使用了局部响应归一化层LRN(Local Response Normalization),在VGGNet被证实基本没有效果,现已弃用。
- 使用了大量的数据增强,减小过拟合。数据增强包括:随机crop图像(平移、翻转、对称等)、改变RGB通道强度等,现在仍在使用。
- 使用了drop=0.5,减小过拟合。
- 使用带动量的SGD,momentum=0.9。
- 随着训练的进行,逐渐减小学习率。初始设置为1e-2,每到val accuracy plateaus就减小10倍。
- 使用L2权重衰减,设置为5e-4。
- 使用集成学习,将7个CNN结果做平均,得到更好的结果。18.2% -> 15.4%
历史原因:
2012年GPU还没有很好性能,所以作者训练AlexNet使用的是GTX 580的GPU卡,显存只有3GB,不足以容纳该网络最大的模型(我们实验室的Tesla P40显存是24GB的,K80双GPU显存也是24GB的)。所以作者使用2块GPU训练:每个GPU上并行地分别运行AlexNet的一部分(例如第一个卷积层有96个feature map分别在两块GPU上,每块有48个feature map),并且只在特定的层上有交互(图中交叉部分)。
AlexNet的意义在于,使得CNNs又重回人们视野,再次掀起对CNNs的研究热潮。
Case study: ZFNet
【Zeiler and Fergus, 2013】
ZFNet是2013年ILSVRC的冠军,在超参数上对AlexNet进行微调:
- 把AlexNet中CONV1(11x11 stride 4)改为(7x7 stride 2)
- 把AlexNet中CONV3,4,5(384,384,256 filters)改为使用(512,1024,512)
通过微调,ZFNet ImageNet top 5 error:16.4% -> 11.7%
ZFNet的意义不在于它获得了2013年ILSVRC的冠军,而是解释了为什么CNNs有效、怎么提高CNN性能。
其主要贡献在于:
- 使用了反卷积,可视化feature map。通过feature map可以看出,前面的层学习的是物理轮廓、边缘、颜色、纹理,后面的层学习的是和类别相关的抽象特征。
- 与AlexNet相比,前面的层使用了更小的卷积核和更小的步长,保留了更多特征。
- 通过遮挡,找出了决定图像类别的关键部位。
- 通过实验,说明了深度增加时,网络可以学习到更好的特征。
Case study:VGGNet
[Simonyan and Zisserman, 2014]
VGGNet是2014年ILSVRC分类比赛第二名,定位比赛第一名。
主要思想:使用更小的卷积和更深的网络
网络结构特点:
VGG有16层和19层两个版本,使用3x3的卷积,步长为1,这样pad=1时,卷积层输入输出空间大小不变。以及2x2的最大池化,步长为2。
VGGNet ImageNet top 5 error:11.7% -> 7.3%
问题:为什么使用3x3的小卷积核?
所有卷积核都是3x3。连续多个卷积层,后面卷积层对于输入的感受野会变大,如连续2个3x3卷积层,第二层每个神经元感受野为5x5;连续3个3x3卷积层,第三层每个神经元感受野为7x7。这样做有两个好处:
- 多个非线性表达能力强于1个非线性。
- 减少参数数量。depth为C时,连续3个卷积核参数数量为 3∗(3×3C2)=27C2 3 ∗ ( 3 × 3 C 2 ) = 27 C 2 ,单个7x7卷积层参数个数为 7×7C2=49C2 7 × 7 C 2 = 49 C 2 。
一张图片的Total memory:24M * 4 bytes(假设每个数字4个字节 )~= 96MB / image,这相当于5G内存最多只能存50张图片,而这仅仅只是前向传播的内存,反向传播需要的内存是前者的两倍。
Total params:138M parameters
通过计算可知,大多数内存用在前几层卷积层上,大多数参数产生于最后几层全连接层。
细节:
- VGGNet的训练过程和AlexNet相似
- 没有使用LRN,证明其无效
- 使用VGG16或VGG19,或者性能更好一些,但是占用的内存更多
- 也使用了集成学习,获得最好的结果
- FC7输出的特征泛化能力很好,可以用于其他任务
Case study:GoogLeNet
[Szegedy et al., 2014]
GoogLeNet是2014年ILSVRC分类比赛冠军(top 5 error:6.7%)。
主要思想:更深的网络,计算高效
GoogLeNet创造了新的网络结构形式,其特点如下:
- GoogLeNet一共有22层
- 使用了高效的“Inception module”,其结构如上图所示:设计了一个局部网络拓扑(网络中嵌套着网络),并且在顶层堆叠
- 没有使用全连接层,因此减少了大量参数
- 只使用了5百万的参数,比AlexNet要少12倍
”Inception module”也进行了一些改进,最初的设计如下图所示:
在进行最初的几层基本卷积池化操作后,应用几个平行的卷积操作:
- 多个不同感受野的卷积操作(1x1,3x3,5x5),通过zero-padding保持空间大小不变
- 最大池化操作(3x3),相当于保存了原始输入的深度,额外增加一个池化会有额外溢出
低层特征经过“inception module”提取,又把特征混合在一起,空间大小不变,得到一个更深的输出。参数计算如上图所示,其输出深度为256,输出为672,深度增加,但同时卷积操作高达854M,计算力相当大!
问题:如何保证计算高效性?
解决方法:使用1x1卷积的“bottleneck”层去减小深度。如下图所示。
这里引入1x1卷积的目的是:
- 降维,减小了计算量
- 保留了空间特征,减小了深度
通过引入“bottleneck”层,卷积操作变为358M,计算力大大减少。
完整的网络结构如上图所示:
- 前面几层依然是[CONV-POOL-CONV-CONV-POOL]
- 主体部分是Inception结构,通过堆叠”Inception Modules”形成
- 使用average pooling代替full-connect,最后一层为softmax用来分类,移除了全连接层
- 将中间一些层的结果输出,用作辅助分类输出,按一个较小的权重(0.3)加到最终分类结果中,这样做相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对训练有帮助。但测试时不使用,后面实验证明这个帮助其实不大。
Case study:ResNet
[He et al., 2015]
ResNet是2015年ILSVRC的冠军,几乎横扫了所有计算机视觉的比赛,赢得了everything,是深度学习的一次革命。ImageNet比赛中用了152层的模型,top 5 error:3.57%,比人眼分类的错误率更低(人眼是5.1%)。
主要思想:使用残差连接的深度网络
问题:网络层数不断加深,训练误差和测试误差不降反升,为什么?
训练误差也升高,说明不是过拟合的问题。
这里有一个假设:这个问题是一个优化问题,越深的网络越难优化。因此自然而然地想到,一个更深的模型如果不能取得更好的性能,但至少与浅层的模型表现应该是一样好的。所以可以尝试通过设置额外层把浅层模型恒等映射到更深的模型中。
解决方法:使用网络层来匹配一个残差映射,而不是直接尝试匹配所需的底层映射。如下图所示。
未加残差结构时,学习映射为H(x),但是H(x)不容易学;加上残差结构后,学习映射为F(x)=H(x)-x,学习F(x)比学习H(x)容易,那么通过学习F(x)来得到H(x)=F(x)+x,这就是残差结构。F(x)就是指残差,也是delta。
完整的ResNet结构:
- 堆叠残差块,每个残差块都有2个3x3的卷积层
- 周期性使用尺寸大小为3x3,步长为2的卷积核进行下采样
- 网络最开始增加卷积层
- 在网络最后一层没有使用全连接
对于更深的网络(超过50层),ResNet使用“bottleneck”层减少计算量(和GoogLeNet相似)。
ResNet训练细节:
- 在没有卷积层后加了Batch Normalization(这是GoogLeNet V2提出的,效果非常好)
- 使用Xavier/2来初始化参数
- 带动量参数的SGD(momentum=0.9)
- 初始学习率设为0.1,每到验证误差高原期(validation error plateaus)的时候就下降10倍
- Mini-batch size 256
- 权重衰减weight decay 设为1e-5
- 没有使用dropout,因为BN已经减少了过拟合,而且效果很好
Compare
Inception-v4:ResNet+Inception
VGG:占用内存最多,计算量最大
GoogLeNet:更高效
AlexNet:计算量很小,但占用内存很大,准确度低
ResNet:计算量,占用内存,准确度三种权衡最佳
Other…
除了以上这些经典结构以外,还有一些很不错的网络结构。
比如提出“bottleneck”的Network in Network
对ResNet进行改进的一系列结构,如Identity Mapping(这其实是Kaiming He解释ResNet),Wide ResNet,ResNeXt,Deep Networks with stochastic Depth
还有在ResNet之上的FractaNet,DenseNet
或是其他更高效的网络,SqueezeNet
有时间再整理一番。
Summary
- VGG,GoogLeNet, ResNet all in wide use, available in modelzoos
- ResNetcurrentbestdefault
- Trendtowards extremely deep networks
- Significantresearch centersarounddesign of layer / skip connections and improving gradientflow
- Evenmore recent trend towards examining necessity of depth vs. widthand residualconnections
Reference
PS:网上博客仅供参考,很多也都是东拼西凑,有些不免还有错误,会误导他人。还是需要自己认真研读论文,思考揣摩。另,本人博客内容也仅供参考,如有错误,请积极指出。
一起学习,共同进步!