按照发展顺序以及相互关系介绍:

LeNet

主要贡献:卷积神经网络的开山祖师爷,第一次定义了CNN的网络结构

网络结构:2个卷积层 + 降采样(这时候都还不叫池化) + 激活函数 + 3个全连接层

  1. 卷积层:局部连接、权值共享
  2. 降采样:窗口形状为2 * 2,步幅为2,选择局部区域内最大的值作为下采样的结果。池化区域不重叠。
  3. 激活函数:Tanh(现在都改成了ReLU

在LeNet后,针对数据与硬件这两个优化方向,提出了AlexNet。

AlexNet改进

网络结构:使用了5层卷积和2层全连接隐藏层,以及1个全连接输出层

改进优势

  1. 以ReLU替代sigmoid或tanh,网络训练以更快速度收敛
    • 当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数
    • 若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练
    • ReLU激活函数在正区间的梯度恒为1,负梯度为0,可以减少一半的计算量。
  2. 双GPU并行计算:算力更强,因此可以使用更大更深的网络。(与参数有关)
  3. 重叠池化:Pooling窗口存在重叠。可以提高精度,不容易产生过拟合。可以减少一部分信息的丢失。
  4. 全连接层Dropout:
    • 随机丢弃一定比例的神经元,被丢弃的神经元将不参加训练过程,权重也不做更新
    • 每次迭代的时候,网络架构都不一样,可以大概率避免过拟合的发生(Ensemble Learning
  5. 数据增强:翻转、裁剪和颜色变化,扩大数据集来缓解过拟合

*注意:它的卷积窗口形状在不断减小,从11到3,这一变化与图像和特征图的尺寸是相关的。(防止捕捉不到物体就需要大一点的)

VGG

网络结构:五个卷积层与激活函数的叠加部分 + 2个FC隐藏层 + 1个FC输出层

改进优势

  1. 用多个3*3小卷积核替换了大卷积核,并由此组成了不同的vgg块,在每个block的最后进行池化操作。

    • 5 * 5 感受野 --> 3 * 3感受野 --> 1

    • 减少了网络参数量,减少计算量

    • 更大的网络深度,非线性次数变多,使得学习能力变得更好

  2. 使用了步幅为2,窗口形状为2 * 2的最大池化层,每次池化后的尺寸减半。上图的红色部分。

  3. 去掉了局部相应归一化层(BN)

  4. 允许使用多个尺度的图片进行训练:在最后一层使用的是全连接卷积神经网络,因此允许输入维度是变化的。(Multi-scale Training)

*关于参数:前两层卷积占据了绝大部分的内存(因为图片尺寸较大);第一层全连接层占据了绝大部分参数(4096 * 7 * 7 *512)

GoogLeNet

提出原因:(按推理顺序

  • 网络层数越深效果越好
  • 模型越深参数越多,容易导致过拟合,且网络的计算量大
  • 能否在增加复杂度的同时减少网络参数
  • 设计出了GoogLeNet

主要思想使用不同尺度的卷积核怼原图(输入)进行不同尺度的卷积,再将卷积结果做通道合并。4条线路子网络,并行抽取信息。

改进的Inception模块

网络结构:9个Inception(原始结构无1*1卷积核)

  • 同样为5个模块,每个模块之间使用步幅为2的3*3最大池化减少输出的尺寸
  • 使用GAP替换了第一个全连接层,将每个通道的高宽变为1
  • 模块介绍:
    • 1: 64通道的7 * 7卷积 + 3 * 3最大池化
    • 2: 2个卷积层 + 最大池化
      • 64通道的1*1卷积
      • 3*3卷积
    • 3: 串联2个完成的Inception
    • 4: 串联5个(在第2个和第5个部分设置了额外的辅助 Loss,用以增加向后传导的梯度,缓解梯度消失问题
    • 5: 串联2个

ResNet

结构对比

  • 普通:输入为x,直接拟合理想映射fx
  • ResNet:理想映射仍为fx,但拟合对象为与恒等映射有关的残差映射fx-x;当虚线框内的权重与偏置均为0时,fx=x为恒等映射。

主要贡献

  • 近道具有自我闭合的能力:结合网络结构看,若网络在层次加深时性能退化,则它可以通过控制网络中的近道和非近道的组合比例来退回之前浅层的状态。也就是说,虚线内参数全部为0时可以恢复到之前的状态,至少不会变差。
  • 能缩短误差反向传播到各层的路径,有效抑制梯度消失的现象,从而使网络在不断加深时性能也不会下降。
  • 成功解决了网络退化的问题。

主要思想:添加了跳跃连接

网络结构

  • 沿用了VGG全3*3卷积的设计,重新加上了BN
  • 每个残差块里有2个3*3的卷积,第一个后面接了BN和ReLU,第二个后面只接了BN
  • 模块结构
    • 1: 64通道的7 * 7卷积 + BN + 3 * 3最大池化
    • 2: 后接4个由残差块组成的模块,每个模块包含若干个残差块(原文为2个)。因此共有8个残差块,每个模块都进行了4次卷积。
    • 每个模块在第一残差块里将上一个模块的通道数翻倍,并将高宽减半;第二个保持尺寸。
    • GAP后接全连接层,因此整个网络共 1 + 16 + 1 = 18层

DenseNet

网络结构:跳跃连接,使用通道连接

  • 稠密块:
    • 每块的输入与输出在通道维上连结
    • 由多个卷积块组成,卷积块顺序为 BN + ReLU + Conv
    • 比如一个稠密块内包含了4个卷积,每个卷积输出为32。每个卷积的输入尺寸是变化的(是上层输入和输出的拼接),但输出尺寸不变。而最后稠密块的输出通道相比于输入,将增加128个通道,
  • 过渡层:
    • 1*1卷积 + 平均池化,实现尺寸、通道减半
    • 功能:由于稠密块会增加通道数,因此在两个稠密块之间加入过渡层,可以控制模型复杂度

结构特点

  • 特征复用:每个卷积块使用相同的输出通道数。将每块的输入与输出在通道维上连结,以做为下一块的输入特征复用
  • 卷积块的通道数控制了输出通道数,相当于输入通道数的增长

优点:通过特征复用来减少网络的参数量,在一定程度上缓解了梯度消失。

相关问题

Q1. 卷积 & 池化公式计算

假设卷积核大小为K,移动步幅为stride,开始时特征图大小为SinS_{in},填充为P,卷积后特征图大小为SoutS_{out}.

1
2
3
4
5
6
7
8
第一次卷积: 1 —— K
第二次卷积: 1 + stride —— K + stride
第三次卷积: 1 + 2*stride —— K + 2*stride
...
第t次卷积: 1 + (t-1)*stride —— K + (t-1)*stride

假设经过t次卷积后结束后
K + (t-1)*stride = S_in + 2P

上述公式经过移项后,可得

Sout=Sin+2PKstride+1S_{out} = \frac{S_{in}+2P-K}{stride} + 1

由于池化时不需要填充,因此依照上述的分析,可以直接得到

Sout=SinKstride+1S_{out} = \frac{S_{in}-K}{stride} + 1

Q2. 池化层及其作用

作用

  1. 减少参数量,有效防止过拟合现象
  2. 保持对平移(小量)、伸缩、旋转操作的不变性
  3. 提高感受野的大小

Average Pooling:

取窗口内的平均值作为结果,可以保留背景信息。

反向传播将把梯度等分为k * k份分配给前一层,保证池化前后的梯度(残差)之和保持不变。

Maximum Pooling:

去窗口内的最大值作为结果传递,可以提取特征纹理,减少无用信息的影响。

反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。

Global Pooling:

不以窗口的形式取均值,而是以feature map为单位进行均值化,一个feature map输出一个值。

Q3. 卷积的本质

  1. 从积分公式理解:不稳定的输入fx,稳定的输出gx,求得系统存量
  2. 周围像素点对当前像素值如何产生影响
  3. 一个像素点如何向周围进行试探(Sobel算子等

代入理解每一层的卷积过程:

  • 假如第一层的卷积提取的是图像的浅层语义信息,如入最简单的边缘。

  • 随着层数的增多,某一像素点将表示感受野中众多像素点对其影响逐步积累,进而得到可以表达该图像的深层语义特征。

Q4. 1$\times$1卷积核的作用

1*1卷积核的通道数与输入特征图应该相同。

作用如下:

  • 实现降维或升维,减少通道数从而降低模型复杂度
  • 跨通道信息交融
  • 减少了参数量
  • 增加模型的深度,进而提高非线性的表示能力

Q5. 网络退化、过拟合、梯度消失之间的关系

网络退化:学习效果并非随着网络深度的增加而变好。56层的表现比22层差。

过拟合:训练集表现好,但测试集差。出现退化时,无论是训练集还是测试集,56层的效果都比22差。

梯度消失:效果随着训练迭代不会变好,梯度不再更新。但是退化时还是有很明显的梯度变化。