GITHUB(持续更新):

liuyuemaicha/cnn_modelgithub.com/liuyuemaicha/cnn_model[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图1

github 代码依赖: python 2.7, Pytorch 0.3.1

1 LeNet

LeNet 虽然不是 CNN 的起点,但却是后来 CNN 兴起的标志模型。LeNet-5 是 1998 年 YannLeCun 设计用于手写数字识别的模型。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图2

图 1.1:LeNet-5 网络结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图3

图 1.2:LeNet-5 网络结构

在当年神经网络还是 MLP(Multilayer Perceptron,多层感知机)大行其道时,能设计出这样的模型已实属不易,也为后来 CNN 模型的发展奠定了基础。

特点:

  1. 相比 MLP,LeNet 使用了相对更少的参数,获得了更好的结果。

  2. 设计了 maxpool 来提取特征

2 AlexNet

AlexNet 是 Hinton 和他的学生 Alex 在 2012 设计的网络,并获得了当年的 ImageNet 竞赛冠军。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图4

图 2.1: AlexNet 网络

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图5

图 2.2: AlexNet 网络

特点:

  1. 相比 LeNet,AlexNet 设计了更深层的网络。

  2. 在每个卷机后面添加了 Relu 激活函数,解决了 Sigmoid 的梯度消失问题,使收敛更快。

  3. 添加了归一化 LRN(Local Response Normalization,局部响应归一化)层,使准确率更高。

  4. 设计并使用了 dropout 层,减轻了模型的过拟合。

  5. 通过裁剪,旋转等方式增强了训练数据。

  6. 受于当时的算力限制,Alexnet 创新地将图像分为上下两块分别训练,然后在全连接层合并在一起(AlexNet 网络图 1,可以看到有上下两部分)。

3 VGGNet

VGGNet 在 2014 年的 ImageNet 比赛中,分别在定位和分类跟踪任务中取得第一名和第二名。VGGNet 主要特点:

  1. 探索了更深层次的网络结构图,可以看成是 AlexNet 的加强版本。

  2. 在卷机设计上,使用了更小的卷机核,验证了小尺寸的卷机核在深度网络中,不仅减少了参数,也达到了更好的效果。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图6

图 3.1: VGGNet 网络结构图

4 GoogLeNet

4.1 GoogLeNet v1

GoogLeNet v1 版本诞生于 2014 年,在 ILSVRC 比赛中获得冠军,其性能与同年诞生的 VGG 差不多,但参数量少于 VGG。该模型并没有单纯的将网络加深,而是引入了 Inception 概念,通过多个卷积核提取图像不同尺度的信息,最后进行融合,可以得到图像更好的表征

特点:

  1. 引入 Inception 概念,在当时流行模型‘加深’情况下,设计了‘加宽’的思路

  2. 采用 Network in Network 中用 Average pool 来代替全连接层的思想。实际在最后一层还是添加了一个全连接层,是为了大家做 finetune。

  3. 另外增加了两个辅助的 softmax 分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求导为 0,链式求导结果则为 0。二是将中间某一层输出用作分类,起到模型融合作用。最后的 loss=loss_2 + 0.3 loss_1 + 0.3 loss_0。实际测试时,这两个辅助 softmax 分支会被去掉。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图7

图 4.1: Inception

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图8

图 4.2

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图9

图 4.3: GoogLeNet V1 整体结构

4.2 GoogLeNet V2,V3

在 2015 年,同篇论文中发布了 GoogLeNet V2 和 V3 版本。

V2 特点:

  1. 学习 VGGNet 的特点,用两个 33 卷积代替 55 卷积,降低参数量,提高计算速度,从而提升性能。(下图 Figure5)
  2. 它们将滤波器大小 nxn 的卷积分解为 1xn 和 nx1 卷积的组合。例如,3x3 卷积相当于首先执行 1x3 卷积,然后在其输出上执行 3x1 卷积。他们发现这种方法比单个 3x3 卷积便宜 33%。(下图 Figure6)
  3. 模块中的滤波器组被扩展(更宽而不是更深)以消除代表性瓶颈。如果模块变得更深,则尺寸会过度减少,从而导致信息丢失。(下图 Figure7)

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图10

图 4.4: 3 种 Inception 结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图11

图 4.5: GoogLeNet v2 结构

V3 包含了为 V2 规定的所有上述改进,另外还使用了以下内容:

  1. RMSProp 优化器。
  2. 学习 Factorization into small convolutions 的思想,将 7x7 分解成两个一维的卷积(1x7,7x1),3x3 也是一样(1x3,3x1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将 1 个 conv 拆成 2 个 conv,使得网络深度进一步增加,增加了网络的非线性,还有值得注意的地方是网络输入从 224x224 变为了 299x299,更加精细设计了 35x35/17x17/8x8 的模块。
  3. 辅助分类器中的 BatchNorm。BN 算法是一个正则化方法,可以提高大网络的收敛速度。简单介绍一下 BN 算法。就是对输入层信息分布标准化处理,使得规范化为 N(0,1) 的高斯分布,收敛速度大大提高。
  4. 标签平滑(添加到损失公式中的一种正规化组件,可防止网络对类过于自信。防止过度拟合)。

4.3 GoogLeNet V4 ,Inception-ResNet v1 和 v2

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图12

图 4.6: V4 版本 3 种 Inception 结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图13

图 4.7: 4 种 Reduction 结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图14

图 4.8: 3 种 Inception-ResNet-V1 结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图15

图 4.9: 3 种 Inception-ResNet-V2 结构

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图16

图 4.10: Inception-ResNet 结构中加入 Activation Scaling,防止网络 “死亡”

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图17

4.11: Stem 与最终网络结构图

V4 与之前的 V3,V2 版本主要改动有:

  1. 修改了 stem,这里的 stem 是指在引入 Inception 块之前执行的初始操作集。
  2. V4 引入了专门的 “Reduction Blocks”,用于改变网格的宽度和高度。早期版本没有显式 Reduction Blocks,但实现了类似功能。
  3. V4 版本的 3 种 Inception 与之前版本的 3 种 Inception 非常相似,但也做了细节的修改。

Inception-ResNet V1 和 V2 特点:

  1. 在 Inception 设计中加入了 ResNet 思想。从图 4.8 和图 4.9 可以看到,V1 和 V2 中的 3 种 Inception-ResNet 结构相同,不同的只是超参数。
  2. Inception-ResNet V1 与 V2 的整体结构不同,Inception-ResNet V1 的计算成本与 Inception v3 类似,Inception-ResNet V2 的计算成本与 Inception v4 类似。
  3. 为了实现残差加法,卷积后的输入和输出必须具有相同的尺寸。因此,我们在 Inception 卷积之后使用 1x1 卷积来匹配深度大小(卷积后的深度增加)。
  4. 主要 Inception 模块内的池化操作被替换为有利于残差连接。但是,您仍然可以在 reduction blocks 中找到这些操作。Reduction Block A 与 Inception v4 中的相同。
  5. 如果滤波器的数量超过 1000,那么网络架构中更深的残差单元会导致网络 “死亡”。因此,为了增加稳定性,作者将残差激活量调整,系数为 0.1 到 0.3,如图 4.10。
  6. 为了在单个 GPU 上训练模型,原始论文在求和之后没有使用 BatchNorm(以使整个模型适合单个 GPU)。
  7. 结果发现,Inception-ResNet 模型能够再用较少的 epoch 时获得更高的精度。

5 ResNet

随着算力的不断更新,越来越深的网络能够得到计算,但研究者发现随着网络的加深,模型变得越来越不能够训练,遇到了梯度消失或爆炸问题。在 ResNet 出现之前,人们通过 BN,Relu 等方式去缓解此问题,但仍然不能把网络做到足够深。

15 年何恺明提出了 ResNet 网络,该思路启发于 LSTM 的控制门的思想。

y = H(x,WH)•T(x,WT) + X•(1- T(x,WT))

可以看出,当 T(x,WT) = 0,y=x,当 T(x,WT) = 1,y= H(x,WH)

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图18

图 5.1 ResNet 中的 block 示意图

从图 5.1 可以看出:相比传统网络:y=f(x),ResNet Block 公式为:y=f(x) + x,可以称之为 skip connect。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图19

图 5.2 ResNet 网络中使用的两种 Block

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图20

图 5.3 不同层数的 ResNet 设计方式

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图21

图 5.4 34 层 ResNet 与其他网络的比较

题外话:

Orhan 等发表的论文《Skip connections eliminate singularities》提出神经网络的退化才是难以训练深层网络根本原因所在,而不是梯度消散。虽然梯度范数大,但是如果网络的可用自由度对这些范数的贡献非常不均衡,也就是每个层中只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低。这也是我们常说的网络退化问题,虽然是一个很高维的矩阵,但是大部分维度却没有信息,表达能力没有看起来那么强大。残差连接正是强制打破了网络的对称性。总的来说一句话,打破了网络的对称性,提升了网络的表征能力。也可查看文献《Understanding and Improving Convolutional Neural Networks via Concatenated Rectified Linear Units》。

6 DenseNet

从图 6.1 中可以看出,DenseNet 是借鉴了 ResNet,是 ResNet 的升级版,从上述 ResNet 可以看到,一般每个 Block 会有一个 skip connect,而 DenseNet 会在每层 conv 间有一个 skip connect。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图22

图 6.1 ResNet Block 与 DenseNetBlock 区别

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图23

图 6.2DenseNet Block 示意图

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图24

图 6.3 DenseNet 各网络结构图

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图25

图 6.4 DenseNet 网络

神经网络越深,网络的能力越强,就越有可能过度学习数据集,导致过拟合。大家应该还记得,作为第一个深层网络 Alexnet 网络,它提出了重要的策略 dropout,对于提高模型的泛化能力非常有效。alexnet 网络至今仍然可以用于很多的任务,这足以说明其鲁棒性。后来 BN 和数据增强等正则化策略替代 dropout 也在一定程度上缓解了过拟合的问题。文《Deep networks with stochastic depth》(Huang G, Sun Y, Liu Z, et al. )是 DenseNet 作者们早期的研究,它们通过训练时随机丢掉一些网络层,提高了 ResNet 的泛化性能。
从这里可以看出来一个重要特性,这也是神经网络中大家比较关心的问题,网络的冗余性绝对是存在的,而且不小,通过探索 dropout 值的比例对性能的影响可以去估算这个冗余。
既然丢掉某些层间连接或者整个层不影响性能,就说明这一层学习到的非线性转变很小,既然转变很小,那么每一层学习几百个通道,还有必要吗?这几百个通道,正是万恶的计算量所在。
考虑到这一点,densenet 就同时做了两件事情,一是将网络中的每一层都直接与其前面层相连,提高特征的利用率;二是把网络的每一层设计得很窄,也就是卷积的输出通道数通常很小,只有几十,该层学习非常少的特征图并与输入 concat 使用。
这实现了资源的最大化利用和计算量的压缩。ImageNet 分类数据集上达到同样的准确率,DenseNet 所需的参数量不到 ResNet 的一半,所需的计算量也只有 ResNet 的一半左右。
引用自【模型解读】“全连接” 的卷积网络,有什么好?

7 Non-Local Networks

Non-Local Networks 启发于 non-local means 滤波算法,该滤波算法是经典的图像去噪算法之一。在 CNN 模型中不论是 conv 层还是 pool 层(全局 pool 除外),它们对数据的感受野都是局部的。为了增大 conv 或 pool 的感受野,传统方式是增加网络的深度(网络越深,后面 conv 和 pool 的感受野越大),但这样会增加训练的难度(越深越难训练),而且降低效率(参数增加)。该论文提出的 Non-local Networks 可以在每层计算中参考全局信息。

该方法属于自注意力机制的范畴

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图26

图 7.1 non-local means 滤波示意图:non-local 顾名思义,将这个邻域扩展到全图。如上图 p 作为中心像素,q1,q2,q3 对 p 的滤波都有贡献,实际上图像上任意一个点都有贡献。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图27

图 7.2 None-local 的实现方式

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图28

图 7.3 None-local 公式

Non-Local Networks 代码(pytorch):

  1. self.g = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)
  2. self.theta = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)
  3. self.phi = conv_nd(in_channels=self.in_channels, out_channels=self.inter_channels, kernel_size=1, stride=1, padding=0)
  4. self.W = conv_nd(in_channels=self.inter_channels, out_channels=self.in_channels, kernel_size=1, stride=1, padding=0)
  5. g_x = self.g(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
  6. theta_x = self.theta(x).view(batch_size, self.inter_channels, -1).permute(0, 2, 1)
  7. phi_x = self.phi(x).view(batch_size, self.inter_channels, -1)
  8. f = torch.matmul(theta_x, phi_x)
  9. f_div_C = F.softmax(f, dim=-1)
  10. y = torch.matmul(f_div_C, g_x).permute(0, 2, 1).contiguous()
  11. y = y.view(batch_size, self.inter_channels, *x.size()[2:])
  12. W_y = self.W(y)
  13. z = W_y + x

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图29

图 7.4 Non-local 网络结构

特点:

  1. 对于视频分类,non-local 会好于相应的一般网络,毕竟没有大的感受野未必能很鲁棒的捕捉一个动作到底是跳高还是跳水。
  2. 依据作者们的结论,在网络浅层效果会更好,毕竟随着网络深度增加,传统网络感受野也会增加了,Non-local 的效果也就不再明显。

补充:

这里的 Non-Local 和 NLP 中的 Self-Attention 有异曲同工之妙,它们本质是一样的,NLP 是当前 token 与上下文的关系,此处图片是当前像素与全图像素的关系。

NLP 中的 Self-Attention 计算图如下:

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图30

图片源自网络,侵删

NLP 在计算 Self-Attention 时,会生成 3 个向量:查询向量 q,键向量 k 和值向量 v;步骤:

  1. 查询向量 q*键向量 k,得到上下文的全局 token 与当前 token 的关联度,再通过求均值和 softmax 将关联度做归一化;
  2. 上下文的每个 token 向量乘以其对应的关联度,再求和,从而得到当前 token 的 word embedding。

Non-Local 与 NLP self-attention 的共同点:

  1. Non-Local 代码中的 theta_x 和 phi_x 相当于 NLP 中的查询向量和键向量, 通过 torch.matmul(theta_x, phi_x) 得到全图像素与当前像素的关联度,再通过 F.softmax(f, dim=-1) 做关联度的归一化;
  2. 全图像素乘以其对应的关联度,再求和,从而得到当前的像素值(特征值)。

8 Deformable Convolutional Networks

同样的物体在图像中可能呈现出不同的大小、姿态、视角变化甚至非刚体形变,如何适应这些复杂的几何形变是物体识别的主要难点。而 Deformable Conv 模型尝试着解决这类问题。

首次在卷积神经网络(convolutional neutral networks,CNN)中引入了学习空间几何形变的能力,得到可变形卷积网络(deformable convolutional networks),从而更好地解决了具有空间形变的图像识别任务。研究员们通过大量的实验结果验证了该方法在复杂的计算机视觉任务(如目标检测和语义分割)上的有效性,首次表明在深度卷积神经网络(deep CNN)中学习空间上密集的几何形变是可行的。
作者:微软亚洲研究院
链接:https://www.zhihu.com/question/57493889/answer/184578752

当前深度模型对物体的几何形变适应能力几乎还是来自于数据本身的多样性,模型内部并不具有适应几何形变的机制。作者认为造成这样的问题是卷积操作本身就是固定的几何结构。

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图31

图 7.5 展示了卷积核大小为 3x3 的正常卷积和可变形卷积的采样方式,(a) 所示的正常卷积规律的采样 9 个点(绿点),(b)(c)(d) 为可变形卷积,在正常的采样坐标上加上一个位移量(蓝色箭头),其中 (c)(d) 作为 (b) 的特殊情况,展示了可变形卷积可以作为尺度变换,比例变换和旋转变换的特殊情况作

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图32

图 7.6 示例图

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图33
[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图34

9 Dilated Convolutional Networks

Dilated Convolution 被中文翻译为 “空洞卷积” 或“膨胀卷积”,我更倾向于称之为“膨胀卷积”。该模型最早由Fisher Yu在 2016 年 ICLR 上发表的论文《Multi-Scale Context Aggregation by Dilation Convolutions》中提出。该模型最早应用于图像分割,因为传统 CNN 模型需要通过 pooling 层来缩小图像尺寸,并扩大下一层的感受野,即进行下采样(down sampling);这一过程肯定会有信息丢失。因为图像分割是 pixel-wise 的,且在图像预测时还需要进行上采样(up sampling)操作,丢失的信息在上采样过程中也很难再找回。

为了解决上述问题,Fisher Yu提出了 Dilated Convolution 方法,通过 Dilated Convolution 来替代 pooling 层进行下采样操作,不仅扩大了感受野,也不会丢失信息。

下面看一下 dilated conv 原始论文中的示意图:

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图35

(a) 图对应 3x3 的 1-dilated conv,和普通的卷积操作一样,(b) 图对应 3x3 的 2-dilated conv,实际的卷积 kernel size 还是 3x3,但是空洞为 1,也就是对于一个 7x7 的图像 patch,只有 9 个红色的点和 3x3 的 kernel 发生卷积操作,其余的点略过。也可以理解为 kernel 的 size 为 7x7,但是只有图中的 9 个点的权重不为 0,其余都为 0。 可以看到虽然 kernel size 只有 3x3,但是这个卷积的感受野已经增大到了 7x7(如果考虑到这个 2-dilated conv 的前一层是一个 1-dilated conv 的话,那么每个红点就是 1-dilated 的卷积输出,所以感受野为 3x3,所以 1-dilated 和 2-dilated 合起来就能达到 7x7 的 conv),(c) 图是 4-dilated conv 操作,同理跟在两个 1-dilated 和 2-dilated conv 的后面,能达到 15x15 的感受野。对比传统的 conv 操作,3 层 3x3 的卷积加起来,stride 为 1 的话,只能达到 (kernel-1)*layer+1=7 的感受野,也就是和层数 layer 成线性关系,而 dilated conv 的感受野是指数级的增长。

10 SENET

SENET 在 ImageNet 2017 中的 Image Classification 夺得冠军。并在 CVPR 2017 中发表论文《Squeeze-and-excitation networks》。

作者大概总结了前人对 CNN 模型的改进:卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。

近很多工作被提出来从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;还如 Non-local,deformable conv,dilated conv 等都是在空间层面进行改进。

本文提到的 SENet 另辟蹊径,尝试着从 channel 特征中寻找优化点。作者认为在每层卷积中输出的每个 channel,其信息重要性是不同的,我们需要为每个 channel 的 feature map 设置一个权重,来重新量化每个 channel 的特征信息。作者的设计如下图所示:

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图36

图中 Fsq 为 Squeeze 操作,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。

图中 Fex 为 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 来为每个特征通道生成权重,其中参数 被学习用来显式地建模特征通道间的相关性。

图中 Fscale 是一个 Reweight 操作。完成了每个 channel 的特征图权重计算。

SE 作为一个模块,可以跟其他 CNN 模型进行组合使用,下图是分别于 Inception 和 ResNet 进行组合

[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图37

参考文献:

想入门设计卷积神经网络?这是一份综合设计指南mp.weixin.qq.com/s/IMkvod2Lj2VOIWbFtAirzA[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图38

深度智能:InceptionNet 从 v1 到 v4 的演变 25 赞同 · 2 评论文章[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图39

卷积神经网络(CNN)的结构设计都有哪些思想?372 关注 · 10 回答问题

https://mp.weixin.qq.com/s?biz=MzA3NDIyMjM1NA==&mid=2649029645&idx=1&sn=75b494ec181fee3e8756bb0fa119e7ce&chksm=87134270b064cb66aea66e73b4a6dc283d5750cfa9d331015424f075ba117e38f857d2f25d07&scene=21#wechat_redirectmp.weixin.qq.com/s?biz=MzA3NDIyMjM1NA==&mid=2649029645&idx=1&sn=75b494ec181fee3e8756bb0fa119e7ce&chksm=87134270b064cb66aea66e73b4a6dc283d5750cfa9d331015424f075ba117e38f857d2f25d07&scene=21#wechat_redirect

如何评价 MSRA 最新的 Deformable Convolutional Networks?329 赞同 · 7 评论回答[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图40

如何理解空洞卷积(dilated convolution)?722 赞同 · 70 评论回答[转]CNN系列模型发展简述(附github代码——已全部跑通) - 图41

https://www.zhihu.com/question/63460684/answer/300021819
https://zhuanlan.zhihu.com/p/66215918