论文:Densely Connected Convolutional Networks
代码:https://github.com/liuzhuang13/DenseNet
出处:CVPR2017 | 康奈尔大学 清华大学 Facebook
一、背景
越来越深的神经网络会带来梯度消失问题,ResNet 和 Highway Network 使用了恒等映射的方式,让网络都超过了 100 层且效果良好,也就是给梯度增加了一条高速路,可以顺畅的在浅层和深层之间传输。
但这些传输只能在前后两层之间传递,没有最大化信息传输,所以作者提出了 DenseNet。
DenseNet 挣脱了加深和加宽模型的思路,而是通过最大限度的特征重用和旁路的思想来提升网络效果。
二、方法
下图展示了一个 Dense block 内部的结构,一个 block 内部会有多个卷积层,每个卷积层的输入来自前面所有层的输出,前面所有层的特征输出会 concat 然后送入当前层。
Dense 连接只会在每个 Dense block 内部进行,不会进行跨 block 的 Dense 连接
DenseNet 的动机:让信息在网络中的所有层中传递最大化
DenseNet 的做法:在一个 block 内部(即特征图大小都相同),将所有的层都进行连接,即第一层的特征会直接传输给后面的所有层,后面的层会接受前面所有层的输出特征。如图 1 所示。
DenseNet 的特征是如何结合的:不像 ResNet 那样相加起来,而是 concat,所以越往后通道越多
DenseNet 的参数少的原因:DenseNet 的通道很少(如每层 12 个通道),且层浅
首先看一下 ResNet 的网络结构:每层接收上一层的特征输出和上一层的原始输出
然后再来看 DenseNet 的网络结构:每层接收前面所有层的特征输出,然后进行对应层的特征提取
- 特征处理函数 H l H_l Hl:BN + ReLU + 3x3 conv
- transition layer:每两个 dense block 之间都会有传递层,该层由 BN+ 1x1 conv + 2x2 avg pooling 组成
- Growth rate:假设每层输出 k 个通道的特征,则第 l l l 层就会有 k 0 + k × ( l − 1 ) k_0+k \times (l-1) k0+k×(l−1) 个输入, k 0 k_0 k0 为最初输入层通道数。则将 k 称为 growth rate,且 DenseNet 的通道数很小(如 12)。
- Bottleneck layers:尽管 k 不大,但 concat 起来仍然不是一个小的数目,所以引入了一个 1x1 conv 作为 bottleneck layer 用于降低通道,称为 DenseNet-B (BN + ReLU + 3x3 conv- BN + ReLU + 3x3 conv)
- Compression:为了让模型更简洁,可以在 transition layer 来降低特征图个数,当输出通道小于输入通道时,被称为 DenseNet-C,实验的时候会降低一半的通道
DenseNet 的结构:
ResNet 的结构:
三、效果
DenseNet 的优点:
- 网络更窄,参数更少
- 旁路密集连接增加了特征的重用
- 信息流通最大化,训练简单
- 缓解了梯度消失的问题