前言
之前看的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以上):
BasicBlock:
- 基本情况下(输入输出的通道数不变,大小也不变):卷积层参数是 (3,1,1) ,所以 shortcut 部分直接是恒等映射就行,不需要1x1的卷积。
- 在需要变换大小、维度的情况下(同时是多个串联的ResBlock的第一个Block):由第一个3x3卷积层变换通道和大小,第二个卷积层始终不变。而且 shortcut 部分需要加入1x1的卷积层保证输出大小和残差部分一致。此时 1x1 的卷积层的stride 设置的和 第一个 3x3 卷积层一致。若要使得输入的大小减半,三个卷积层的参数可以设置为:(3,2,1); (3,1,1); (1,2,0)。
- 注意:第二个3x3卷积层不包括 ReLU,而是在相加之后再激活。
BottleNeck:
- 稍微改变了结构,残差部分使用三个卷积层,两个1x1的卷积层分别用于减小和恢复通道数,而中间的3x3的卷积层才用于卷积。(一般通道数减小到原来的1/4)。
- shortcut 部分和Basic Block 设置的一致。
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:以上两种的融合模型。。
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
- Deep Residual Learning for Image Recognition.
- Identity Mappings in Deep Residual Networks.
- Aggregated Residual Transformations for Deep Neural Networks.
- Squeeze and Excitation Networks。
后言
文章是为了方便自己理解而写,所以难免有不清楚或错误之处、或者自创的方便理解的术语,如有错误,欢迎指正。