DNN网络结构(一)

前言

之前看的DNN的网络结构都忘干净了,准备重新看看具体结构,再加上实现,还得学学pytorch。。

所以以下是对网络结构的思想、具体结构、实现细节的简述,备用随时回看。

内容包括:

  • ResNet
  • ResNet 变种

ResNet [1]

ResNet 提出的残差结构,最大的好处是可以学习恒等映射,并且保证了梯度的传播,避免了深层网络训练时的梯度消失问题,使得训练超深网络成为可能,实验中ResNet可以训练 1001 层。

ResNet Residual Block 的函数

ResNet 的 motivation 是使得 Residual Block 的网络学习残差函数(和传统的网络直接学习输入输出的映射区别):

一个 Residual Block 的 由 输入 和 学习的残差函数构成,进一步可以将一个 Residual Block 的函数表示成:

如果 的输出大小和不一致,则可以使用一个线性变换矩阵(实际中就是1x1的卷积层)对进行变换,如下:

注意的是:如果 仅由一层FC层组成,那就可以整合成一个线性变换矩阵,所以尽量使用两层以上( Basic Block 两层,BottleNeck 三层)。

ResNet 架构

从VGG的经验中遵循的两个设计要点:

  • 尽量使用 3x3 的卷积核
  • 当图片的大小减半时,成倍增加 channel 大小(保持同样的计算量)。

ResNet 在线性层上的改变:

  • VGG、AlexNet 拥有两个超大的 FC 层,ResNet 使用 AvgPooling + 一个 FC 层 + softmax 用于分类。
  • 每一个 ConvBlock 由 ( Conv + BN + 激活 )组成(除了部分地方)。

ResNet的 Basic Block 和 BottleNeck 结构如下图(BottleNeck 用于更深的网络,ResNet-50以上):

Basic Block (左图) 和 BootleNeck (右图)

BasicBlock:

  1. 基本情况下(输入输出的通道数不变,大小也不变):卷积层参数是 (3,1,1) ,所以 shortcut 部分直接是恒等映射就行,不需要1x1的卷积。
  2. 在需要变换大小、维度的情况下(同时是多个串联的ResBlock的第一个Block):由第一个3x3卷积层变换通道和大小,第二个卷积层始终不变。而且 shortcut 部分需要加入1x1的卷积层保证输出大小和残差部分一致。此时 1x1 的卷积层的stride 设置的和 第一个 3x3 卷积层一致。若要使得输入的大小减半,三个卷积层的参数可以设置为:(3,2,1); (3,1,1); (1,2,0)。
  3. 注意:第二个3x3卷积层不包括 ReLU,而是在相加之后再激活。

BottleNeck:

  1. 稍微改变了结构,残差部分使用三个卷积层,两个1x1的卷积层分别用于减小和恢复通道数,而中间的3x3的卷积层才用于卷积。(一般通道数减小到原来的1/4)。
  2. shortcut 部分和Basic Block 设置的一致。

ResNet 参数设置:

不同层数ResNet配置

注意到Basic Block和BottleNeck 的relu 都是在 x + F(x) 之后的,针对这一点,提出了另外一篇论文[2]改进了残差结构。

ResNet2 [2]

针对 ResNet 中 ResBlock 的结构,文章[2] 进行了更多的探索,主要的结论有:

  • 实验说明了最佳的残差连接就是恒等映射,1x1卷积、scale、门控单元等连接方式都有各自的问题,或者效果更差。(此处不详述)
  • propose pre-activation 结构,实验和理论验证了结论。
pre-activation
不同连接结构

一点总结:

  • 保证有一条 clean path 给梯度流通比较好,(a)(b) 就不符合。
  • 残差部分学习到的残差输出的区间应该是 ,所以残差最后不要加ReLU(残差输出就变成了)。(c) 就不符合。
  • full pre-activation 的模型实验效果比baseline好,作者认为(d)的结构仅将 ReLU 前置,不能享受BN的益处,所以 propose (e) 结构。

ResNet 变种 [3][4]


列一下(还没看简述下):

  • ResNeXt [3]: inception 结构加上残差连接。
  • SE-ResNet [4]:为了利用不同通道的信息,学习不同通道的重要性,加入通道的shortcut,得到不同通道的重要性权重。
  • SE-ResNeXt:以上两种的融合模型。。
SE-ResNet Module

Codes and more material


torchvision 中 ResNet 的实现仅使用了[1] 中的结构,源码如下:https://github.com/pytorch/vision/blob/master/torchvision/models/resnet.py

自实现代码(包含pre-activation版本)实现在: https://gist.github.com/MercuriXito/a0ca5eb1794c28ad181712bc5def4ed3

More consideration of ResNet structure: http://torch.ch/blog/2016/02/04/resnets.html

Reference


  1. Deep Residual Learning for Image Recognition.
  2. Identity Mappings in Deep Residual Networks.
  3. Aggregated Residual Transformations for Deep Neural Networks.
  4. Squeeze and Excitation Networks。

后言

文章是为了方便自己理解而写,所以难免有不清楚或错误之处、或者自创的方便理解的术语,如有错误,欢迎指正。

你可能感兴趣的:(DNN网络结构(一))