CNN Architecture

CS231n: Convolutional Neural Networks for Visual Recognition Lecture 9 CNN Architecture 笔记总结

主要根据ILSVRC(ImageNet Large Scale Visual Recognition Challenge)历届冠军论文,把经典的CNN Architecture做了整理,其中有加入个人理解,如有错误,请积极指出。

课程内容非常好,讲解很细致,推荐。

Preview

总结一下卷积层的性质(其中两个公式要牢记,之后会用到):

  • 输入数据体的尺寸为 W1H1D1 W 1 ∗ H 1 ∗ D 1
  • 四个超参数:
    • 滤波器的数量K
    • 滤波器的空间尺寸F*F
    • 步长S
    • 零填充数量P
  • 输出数据体的尺寸为 W2H2D2 W 2 ∗ H 2 ∗ D 2 ,其中
    • W2=(W1F+2P)/S+1 W 2 = ( W 1 − F + 2 P ) / S + 1
    • H2=(H1F+2P)/S+1 H 2 = ( H 1 − F + 2 P ) / S + 1 (宽度与高度计算方法相同)
    • D2=K D 2 = K
    • P=(FS)/2 P = ( F − S ) / 2 (保证输入和输出尺寸相同)
  • 由于参数共享,每个滤波器包含 FFD1 F ∗ F ∗ D 1 个权重,卷积层一共有 FFD1K F ∗ F ∗ D 1 ∗ K 个权重和 K K 个偏置。
  • 在输出中,第d个深度切片(空间尺寸是 W2H2 W 2 ∗ H 2 ),用第 d d 个滤波器和输入数据进行有效卷积运算的结果(使用步长S),最后再加上第d个偏差。

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输出的计算方式是:

yi=j(xjwij)2 y i = ∑ j ( x j − w i j ) 2

(注:这部分写的不清楚,需要再看看)

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]

这一层的参数量: (11113)96=35K ( 11 ∗ 11 ∗ 3 ) ∗ 96 = 35 K

Second layer (POOL1):3x3大小的window,步长为2

输出数据体大小:套用计算公式,(55-3)/2+1=27,所以输出数据体大小是[27x27x96]

这一层的参数量:0!(池化层没有参数)

其余各层计算相同,得到以下结果:

这里写图片描述

其他细节及创新点:

  1. 第一次使用ReLU非线性激活代替tanh和sigmoid,加快训练速度。
  2. 使用了局部响应归一化层LRN(Local Response Normalization),在VGGNet被证实基本没有效果,现已弃用。
  3. 使用了大量的数据增强,减小过拟合。数据增强包括:随机crop图像(平移、翻转、对称等)、改变RGB通道强度等,现在仍在使用。
  4. 使用了drop=0.5,减小过拟合。
  5. 使用带动量的SGD,momentum=0.9。
  6. 随着训练的进行,逐渐减小学习率。初始设置为1e-2,每到val accuracy plateaus就减小10倍。
  7. 使用L2权重衰减,设置为5e-4。
  8. 使用集成学习,将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进行微调:

  1. 把AlexNet中CONV1(11x11 stride 4)改为(7x7 stride 2)
  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性能。

其主要贡献在于:

  1. 使用了反卷积,可视化feature map。通过feature map可以看出,前面的层学习的是物理轮廓、边缘、颜色、纹理,后面的层学习的是和类别相关的抽象特征。
  2. 与AlexNet相比,前面的层使用了更小的卷积核和更小的步长,保留了更多特征。
  3. 通过遮挡,找出了决定图像类别的关键部位。
  4. 通过实验,说明了深度增加时,网络可以学习到更好的特征。

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. 多个非线性表达能力强于1个非线性。
  2. 减少参数数量。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

通过计算可知,大多数内存用在前几层卷积层上,大多数参数产生于最后几层全连接层。

细节:

  1. VGGNet的训练过程和AlexNet相似
  2. 没有使用LRN,证明其无效
  3. 使用VGG16或VGG19,或者性能更好一些,但是占用的内存更多
  4. 也使用了集成学习,获得最好的结果
  5. FC7输出的特征泛化能力很好,可以用于其他任务

Case study:GoogLeNet

[Szegedy et al., 2014]

这里写图片描述

GoogLeNet是2014年ILSVRC分类比赛冠军(top 5 error:6.7%)。

主要思想:更深的网络,计算高效

GoogLeNet创造了新的网络结构形式,其特点如下:

  1. GoogLeNet一共有22层
  2. 使用了高效的“Inception module”,其结构如上图所示:设计了一个局部网络拓扑(网络中嵌套着网络),并且在顶层堆叠
  3. 没有使用全连接层,因此减少了大量参数
  4. 只使用了5百万的参数,比AlexNet要少12倍

”Inception module”也进行了一些改进,最初的设计如下图所示:

这里写图片描述

在进行最初的几层基本卷积池化操作后,应用几个平行的卷积操作:

  1. 多个不同感受野的卷积操作(1x1,3x3,5x5),通过zero-padding保持空间大小不变
  2. 最大池化操作(3x3),相当于保存了原始输入的深度,额外增加一个池化会有额外溢出

低层特征经过“inception module”提取,又把特征混合在一起,空间大小不变,得到一个更深的输出。参数计算如上图所示,其输出深度为256,输出为672,深度增加,但同时卷积操作高达854M,计算力相当大!

问题:如何保证计算高效性?

解决方法:使用1x1卷积的“bottleneck”层去减小深度。如下图所示。

这里写图片描述
这里引入1x1卷积的目的是:

  1. 降维,减小了计算量
  2. 保留了空间特征,减小了深度

通过引入“bottleneck”层,卷积操作变为358M,计算力大大减少。

这里写图片描述
完整的网络结构如上图所示:

  1. 前面几层依然是[CONV-POOL-CONV-CONV-POOL]
  2. 主体部分是Inception结构,通过堆叠”Inception Modules”形成
  3. 使用average pooling代替full-connect,最后一层为softmax用来分类,移除了全连接层
  4. 将中间一些层的结果输出,用作辅助分类输出,按一个较小的权重(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结构:

  1. 堆叠残差块,每个残差块都有2个3x3的卷积层
  2. 周期性使用尺寸大小为3x3,步长为2的卷积核进行下采样
  3. 网络最开始增加卷积层
  4. 在网络最后一层没有使用全连接

对于更深的网络(超过50层),ResNet使用“bottleneck”层减少计算量(和GoogLeNet相似)。

这里写图片描述

ResNet训练细节:

  1. 在没有卷积层后加了Batch Normalization(这是GoogLeNet V2提出的,效果非常好)
  2. 使用Xavier/2来初始化参数
  3. 带动量参数的SGD(momentum=0.9)
  4. 初始学习率设为0.1,每到验证误差高原期(validation error plateaus)的时候就下降10倍
  5. Mini-batch size 256
  6. 权重衰减weight decay 设为1e-5
  7. 没有使用dropout,因为BN已经减少了过拟合,而且效果很好

Compare

这里写图片描述

这里写图片描述
Inception-v4:ResNet+Inception

VGG:占用内存最多,计算量最大

GoogLeNet:更高效

AlexNet:计算量很小,但占用内存很大,准确度低

ResNet:计算量,占用内存,准确度三种权衡最佳

这里写图片描述

Other…

除了以上这些经典结构以外,还有一些很不错的网络结构。

比如提出“bottleneck”的Network in Network

对ResNet进行改进的一系列结构,如Identity Mapping(这其实是Kaiming He解释ResNet),Wide ResNetResNeXtDeep Networks with stochastic Depth

还有在ResNet之上的FractaNetDenseNet

或是其他更高效的网络,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

  1. CNN Architecture
  2. ILSVRC历届冠军论文笔记
  3. 从LeNet-5到DenseNet

PS:网上博客仅供参考,很多也都是东拼西凑,有些不免还有错误,会误导他人。还是需要自己认真研读论文,思考揣摩。另,本人博客内容也仅供参考,如有错误,请积极指出。

一起学习,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值