cs231n学习笔记——Lecture9 CNN Architecture

该博客主要用于个人学习记录,部分内容参考自:[Lecture 9 ] CNN Architectures(CNN架构)CNN Architecture

1、LeNet

image
LeNet在数字识别领域的应用方面取得了成功

1、AlexNet(第一个基于深度学习的网络架构)(2012)

AlexNet的基础架构是:

CONV1 ->MAX POOL1 ->NORM1 ->CONV2 ->MAX POOL2 ->NORM2 ->CONV3->CONV4->CONV5->Max POOL3->FC6 ->FC7->FC8

image

例题:假设输入:227×227×3的图像矩阵

CONV1:有96个步长为4的大小为11×11的卷积核

:第一层输出数据的体积大小是多少?
:利用公式\((N−F)/stride+1\),(227-11)/4+1=55,所以对每个卷积核,我们的输出都是55×55,总共有96个卷积核,则输出图像的尺寸为55×55×96.
:在这一层中参数的数量是多少?
:每个卷积核有11×11×3=363个参数,共有96个卷积核,所以这一层共有363×96=35848个参数。

POOL1:步长为2的大小为3×3的卷积核

:输出数据的体积大小是多少?
:利用公式,(55-3)/2+1=27,输出图像大小为27×27×96.
:在这一层中参数的数量是多少?
0,对于池化层来说,我们只需要观察池化区域并取最大值,所以没有需要训练的参数。

image

3、ZFNet(2013)

在超参数上对AlexNet进行了改进,ZFNet与AlexNet有相同的层数,相同的基本结构,在步长上有一点改进,卷积核数量略有不同,通过超参数的改进使错误率有所提高
image

4、VGGNet(2014)

  • VGGNet是一个层数很深的网络,VGGNet从AlexNet的8层扩展到了16-19层。
  • 包含非常小的卷积核。关键是固定使用了3×3的小卷积核和2×2的池化核。
  • 通过堆叠多个3×3的卷积核来代替大尺度的卷积核(减少所需参数)
  • VGG的设计规则
    • 所有的卷积层都是大小为3×3,步长(stride)为1,边界扩充(pad)为1的。
    • 所有池化层都是大小为2×2,步长为2的。
  • 有5个卷积阶段
    • conv-conv-pool
    • conv-conv-pool
    • conv-conv-pool
    • conv-conv-conv-[conv]-pool
    • conv-conv-conv-[conv]-pool (VGG19 have 4 conv in stage 4 and 5)
  • 通过插入ReLU,两个3x3卷积层可以具有更多的非线性
    image

:为什么要用更小的flters?
:3×3的 conv(步长为1),堆叠起来感受野(receptive field)与一个7×7的卷积核相同。但是,其参数量更小,计算量更少,而且能够组成更深的网络,更多的非线性激活,形成的特征更丰富。

:三个3×3卷积层(步长为1)的有效感受野(receptive field)是多少
:7×7。可以通过堆叠2个3×3的卷积核替代5×5的卷积核,堆叠3个3×3的卷积核替代7×7的卷积核,拥有相同的感受野。

image

  • 存储量主要是在前面的卷积层中,所以,对于后面的卷积层我们可以适当的增加通道数来丰富特征表达;
  • 参数量主要集中在全连接层,因为全连接层是密集连接。
    image

5、GoogleNet(2014)

  • GoogleNet是一个更深的网络结构,有22层
  • 它设计了一个高效的 inception 模块来进行组合卷积。然后再每一层中叠加该模块。
  • 顶层没有使用全连接层,减少了大量的参数。
  • GoogleNet只有500 0000个参数,比AlexNet少了12倍,AlexNet中有6000 0000个参数。

Inception模块

image

  • 调用Inception模块,对进入相同层的相同输入并行应用几种不同的卷积操作。对于来自前面层的输入,进行不同的卷积,像1×1卷积,3×3卷积,5×5卷积,以及池化操作,这样就可以在不同层中得到不同的输出,这些层要做的就是把所有filter输出并在深度层面上串联起来,然后在最后得到一个张量输出,这个输出将进入下一层。

  • Inception module原始的设计如下图所示:
    image

    • 保留了相同尺寸,又扩充了深度
    • 通过零填充(zero padding)保持卷积尺度不变
    • 低层特征经过inception module提取,又把特征混合在一起,空间大小不变,得到一个更深的输出。
  • 原始的Inception module存在的问题

    • 计算量很大image
    • 池化层保留了原始输入的深度,所以每一层的深度只能增加。你将会从池化层得到全特征的深度,同时从卷积层得到额外的特征图,把他们加在一起,所以上图中输入是256的深度,但输出却是672的深度,随着继续执行,深度会增加。
  • 针对原始Inception module的解决方案
    image
    在3×3和5×5卷积层之前使用1×1先通过1×1卷积的Bottleneck层,在池化层之后也会通过1×1卷积的Bottleneck层,以减少深度,降低计算量。

6、ResNet(2015)

ImageNet比赛中用了152层的模型,是使用残差连接的深度网络

引入

问题:深层网络比浅层网络表现得差,但这不是由过拟合引起的
image

假设:这个问题是一个优化问题,越深的网络越难优化。所以深层网络应该至少和浅层网络表现得一样好。一个解决方法是,可以尝试通过设置额外层把浅层模型恒等映射到更深的模型中。

解决方法:使用网络层来匹配一个残差映射,而不是直接尝试匹配所需的底层映射。如下图所示。
image
未加残差结构时,学习映射为H(x),但是H(x)不容易学;加上残差结构后,学习映射为F(x)=H(x)-x,学习F(x)比学习H(x)容易,那么通过学习F(x)来得到H(x)=F(x)+x,这就是残差结构。F(x)就是指残差。

完整的ResNet结构

image

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

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

在实践中的训练细节

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

7、比较

image
image

  • VGG:效率最低,使用最多内存,但表现得确实好
  • GoogleNet:最高效
  • AlexNet:精确度最低,计算量很小,但占用内存很大。
  • ResNet:在内存使用和操作复杂度之间平衡,但精确度最高
  • GoogleNet和ResNet没有使用大型的全连接层,而是在神经网络末端使用全局平均池化global average pooling,大幅降低参数数量。
    image

8、其他架构

(1)基于ResNet

image
image
image
image

(2)非ResNet的网络,但可以与ResNet媲美的网络

image
image
image

总结

image

posted @ 2023-01-13 11:53  jasf  阅读(69)  评论(0编辑  收藏  举报