CS231n-Lecture9:CNN架构

CNN架构

  • AlexNet
  • VGGNet
  • GoogLeNet
  • ResNet
      • Why ResNet?
      • 深度残差学习
  • reference

AlexNet

CS231n-Lecture9:CNN架构_第1张图片

1. CONV1

输入数据:227×227×3

  • 卷积核:11×11×3(步长:4;数量:96)
  • 卷积后数据:55×55×96
  • relu1后的数据:55×55×96
  • Max pool1的核:3×3,步长:2
  • Max pool1后的数据:27×27×96
  • norm1:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
  • 最后的输出:27×27×96

2. CONV2

  • 输入数据:27×27×96
  • 卷积核:5×5(步长:1;数量:256)
  • 卷积后数据:27×27×256 (做了Same padding(相同补白),使得卷积后图像大小不变)。
  • relu2后的数据:27×27×256
  • Max pool2的核:3×3,步长:2
  • Max pool2后的数据:13×13×256
  • norm2:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
  • 最后的输出:13×13×256

conv2中使用了same padding,保持了卷积后图像的宽高不缩小。

3. CONV3

  • 输入数据:13×13×256
  • 卷积核:3×3(步长:1;数量:384)
  • 卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变)。
  • relu3后的数据:13×13×384
  • 最后的输出:13×13×384

conv3层没有Max pool层和norm层

4. CONV4

  • 输入数据:13×13×384
  • 卷积核:3×3(步长:1;数量:384)
  • 卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
  • relu4后的数据:13×13×384
  • 最后的输出:13×13×384

conv4层没有Max pool层和norm层

5. CONV5

  • 输入数据:13×13×384
  • 卷积核:3×3(步长:1;数量:256)
  • 卷积后数据:13×13×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
  • relu5后的数据:13×13×256
  • Max pool5的核:3×3,步长:2
  • Max pool2后的数据:6×6×256
  • 最后的输出:6×6×256

conv5层有Max pool,没有norm层

6. FC6

  • 输入数据:6×6×256
  • 全连接输出:4096×1
  • relu6后的数据:4096×1
  • drop out6后数据:4096×1
  • 最后的输出:4096×1

7. FC7

  • 输入数据:4096×1
  • 全连接输出:4096×1
  • relu7后的数据:4096×1
  • drop out7后数据:4096×1
  • 最后的输出:4096×1

8. FC8

  • 输入数据:4096×1
  • 全连接输出:1000
  • fc8输出一千种分类的概率。

整体来看,AlexNet的卷积核从11到5再到3不断变小,而feature map也通过重叠式max pool在第1、2、5层折半式缩小,到第5个卷积层后,图像特征已经提炼得足够充分,便用两个全连接层和一个softmax层组合得出最终的分类结果。

AlexNet相比LeNet主要的改动在于:

  • 数据增强
    作者将每张图片处理为256×256的大小,但网络结构图中的输入却为224×224,这是因为作者在256×256大小的图片上使用了一个224×224的滑动窗口,将每个滑动窗口中的内容作为输入,这样就能将整个数据集扩大到原来的(256−224)×(256−224)=1024倍
  • Dropout
    有效防止模型过拟合,让网络泛化能力更强,同时由于减少了网络复杂度,加快了运算速度。
  • ReLU激活函数
  • Local Response Normalization (局部响应归一化)
    LRN模拟神经生物学上一个叫做侧抑制(lateral inhibitio)的功能,侧抑制指的是被激活的神经元会抑制相邻的神经元。LRN借鉴侧抑制的思想实现局部抑制,使得响应比较大的值相对更大,提高了模型的泛化能力。LRN只对数据相邻区域做归一化处理,不改变数据的大小和维度。
  • Overlapping Pooling (重叠池化)
    就是池化操作在部分像素上有重合。池化核大小是n×n,步长是k,如果k=n,则是正常池化,如果 k
  • 多GPU并行

VGGNet

CS231n-Lecture9:CNN架构_第2张图片

VGG是基于Alexnet网络的,VGG在Alexnet基础上对深度神经网络在深度和宽度上做了更多深入的研究,业界普遍认为,更深的网络具有比浅网络更强的表达能力,更能刻画现实,完成更复杂的任务。

首先,VGG与Alexnet相比,具有如下改进几点:

  • 去掉了LRN层,作者发现深度网络中LRN的作用并不明显,干脆取消了
  • 采用更小的卷积核-3x3,Alexnet中使用了更大的卷积核,比如有7x7的,因此VGG相对于Alexnet而言,参数量更少
  • 池化核变小,VGG中的池化核是2x2,stride为2,Alexnet池化核是3x3,步长为2

GoogLeNet

CS231n-Lecture9:CNN架构_第3张图片
大量使用1x1的卷积核来降维,同时也有创新,一个inception同时使用多个不同尺寸的卷积层,以一种结构化的方式来捕捉不同尺寸的信息,很大程度地降低了参数量和计算量。

GoogleNet可以看做多个inception的叠加:

对上图说明如下:
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改;
(2)网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全连接,但是网络中依然使用了Dropout ;
(4)为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的softmax会被去掉。

ResNet

Why ResNet?

人们发现当模型层数增加到某种程度,模型的效果将会不升反降。也就是说,深度模型发生了退化(degradation)情况。但是这种退化并不是由过拟合引起的,因为我们发现训练精度和测试精度都在下降。
CS231n-Lecture9:CNN架构_第4张图片
我们可以设想一下,当我们直接对网络进行简单的堆叠到特别长,网络内部的特征在其中某一层已经达到了最佳的情况,这时候剩下层应该不对改特征做任何改变,自动学成恒等映射(identity mapping) 的形式。也就是说,对一个特别深的深度网络而言,该网络的浅层形式的解空间应该是这个深度网络解空间的子集,换句话说,相对于浅层网络更深的网络至少不会有更差的效果,但是因为网络degradation的问题,这并不成立。

那么,我们退而求其次,已知有网络degradation的情况下,不求加深度能提高准确性,能不能至少让深度网络实现和浅层网络一样的性能,即让深度网络后面的层至少实现恒等映射的作用,根据这个想法,作者提出了residual模块来帮助网络实现恒等映射。

深度残差学习

  1. 残差学习 Residual Learning
    事实上,已有的神经网络很难拟合潜在的恒等映射函数H(x) = x。但如果把网络设计为H(x) = F(x) + x,即直接把恒等映射作为网络的一部分。就可以把问题转化为学习一个残差函数F(x) = H(x) - x;只要F(x)=0,就构成了一个恒等映射H(x) = x。 而且,拟合残差至少比拟合恒等映射容易得多。
    于是,就有了论文中的Residual block结构:
    CS231n-Lecture9:CNN架构_第5张图片
    图中右侧的曲线叫做跳接(shortcut connection),通过跳接在激活函数前,将上一层(或几层)之前的输出与本层计算的输出相加,将求和的结果输入到激活函数中做为本层的输出。用数学语言描述,假设Residual Block的输入为 x x x,则输出 y y y 等于: y = F ( x , { W i } ) + x y=F\left(x,\left\{W_{i}\right\}\right)+x y=F(x,{Wi})+x其中 F ( x , { W i } ) F\left(x,\left\{W_{i}\right\}\right) F(x,{Wi})是我们学习的目标,即输出输入的残差 y − x y-x yx。以上图为例,残差部分是中间有一个Relu激活的双层权重,即: F = W 2 σ ( W 1 x ) F=W_{2} \sigma\left(W_{1} x\right) F=W2σ(W1x)其中 σ \sigma σ指代Relu,而 W 1 , W 2 W_{1},W_{2} W1,W2指代两层权重。
    顺带一提,这里一个Block中必须至少含有两个层,否则就会出现很滑稽的情况: y = F ( x , { W i } ) + x = ( W 1 x ) + x = ( W 1 + 1 ) x y=F\left(x,\left\{W_{i}\right\}\right)+x=\left(W_{1} x\right)+x=\left(W_{1}+1\right) x y=F(x,{Wi})+x=(W1x)+x=(W1+1)x显然这样加了和没加差不多。

  2. 网络结构与维度问题
    ResNet结构示意图(左到右分别是VGG,没有残差的PlainNet,有残差的ResNet):
    CS231n-Lecture9:CNN架构_第6张图片
    图中跳接的曲线中大部分是实线,但也有少部分虚线。虚线代表这些Block前后的维度不一致,因为去掉残差结构的Plain网络还是参照了VGG经典的设计思路:每隔x层,空间上/2(下采样)但深度翻倍。也就是说,维度不一致体现在两个层面:空间上不一致深度上不一致空间上不一致很简单,只需要在跳接的部分给输入x加上一个线性映射,即:
    y = F ( x , { W i } ) + x → y = F ( x , { W i } ) + W s x {y}=F\left(x,\left\{W_{i}\right\}\right)+x \quad \rightarrow \quad y=F\left(x,\left\{W_{i}\right\}\right)+W_{s} x y=F(x,{Wi})+xy=F(x,{Wi})+Wsx而对于深度上的不一致,则有两种解决办法,一种是在跳接过程中加一个 1 × 1 1\times1 1×1的卷积层进行升维,另一种则是直接简单粗暴地补零。事实证明两种方法都行得通。
    注:深度上和空间上维度的不一致是分开处理的。

reference

[1]经典CNN结构简析:AlexNet、VGG、NIN、GoogLeNet、ResNet etc.
[2]大话CNN经典模型:GoogLeNet(从Inception v1到v4的演进)
[3]Resnet到底在解决一个什么问题呢?
[4]深度学习网络篇——ResNet

你可能感兴趣的:(CS231n,卷积,神经网络,人工智能)