DenseNet: Densely Connected Residual Network
解决的问题:
- 随着网络层数加深梯度消失的问题:
As information about the input or gradient passes through many layers, it can vanish and “wash out” by the time it reaches the end (or beginning) of the network.
- 原来ResNet中有很多层的贡献很少,在训练的时候可以随机去掉:
Recent variations of ResNets show that many layers contribute very little and can in fact be randomly dropped during training.
新的结构:
一个L层传统的卷积神经网络只有L个连接——每一层和它的下一层之间有一个连接。而这篇文章提出的Dense Convolutional Network (DenseNet) 有
个连接。对每一层来说前面所有层的feature map都是它的输入,而它的输出的feature map又是后面所有层的输入。
为什么有很好的效果? 文章中是这样解释的:
Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.
这句话大概就是在说每一层都能获得来次损失函数的梯度信息以及输入的原始信息,可以看成是一个隐式的监督的网络。
优点:
- 减轻了梯度消失 (alleviate the vanishing-gradient problem)
- 增强了特征的传递 (strength feature propagation)
- 更有效的利用了特征信息 (encourage feature reuse)
- 一定程度上减少了参数数量 (substantially reduce number of parameters)
DenseNet
一个L层的神经网络,每一层都可以看做是一个非线性的映射
,
可以是一系列函数的组合例如BN、ReLU、Pooling、Convolution,用
表示
层的输出,则可以用下面三个式子分别表示传统的卷积神经网络,原始的ResNet和DenseNet:
传统的卷积神经网络:
ResNet:
DenseNet:
表示
层的拼接。从上面的式子还可以看出ResNet和DenseNet的一个区别:ResNet是将不同层的输出加和作为下一层的输入,而DenseNet是拼接。至于为什么,文章中是这么说的:
However, the identity function and output of are combined by summation, which may impede the information flow in the network.
大意是说加和会影响信息在神经网络的传递(???)。
Composite function
对于上面的复合函数
,在这篇文章中是这样定义的:
是三个连续操作的符合,这三个操作依次是BN、ReLU、3x3 convolution。
Pooling layers
神经网络最重要的一点就是进行下采样来改变feature-map的大小,在DenseNet并不会改变feature-map的大小。所以,为了实现下采样作者将这个网络分成多个不同的密集连接的dense block,在dense block之间添加了一个transition layer来做卷积和池化。这篇文章中作者使用的是1x1的卷积层接一个2x2的平均池化。
Growth rate
如果每个
产生
个feature-maps,那么第
层就会有
个feature-maps作为输入。很重要的一点是,与一般的神将网络结构相比,DenseNet的每一层可以很窄,例如让
。 文章将超参数
称为 growth rate
Bottleneck layers
尽管每层只输出
个feature-maps,后面的层还是会有很多的输入,有文章说到
可以被用作
来减少输入的feature-maps的数量。所以作者设计了一种新的
:
,将其称为DenseNet-B。
Compression
为了进一步压缩feature-map的数量,作者还用transition layer来减少输入进dense block的feature-map的数量。作者设计了一个超参数
来控制压缩的力度:如果一个dense block输出了m个feature-maps,则可以通过它后面的transition layer把feature-map的数目减少到
。当同时使用了bottleneck 和
的transition layer 时,作者将这样的模型称为 DenseNet-BC.
Experiments
下表是在三个数据集(C10,C100,SVHN)上和其他算法的对比结果。ResNet[11]就是kaiming He的论文。DenseNet-BC的网络参数和相同深度的DenseNet相比确实减少了很多,参数减少除了可以节省内存,还能减少过拟合。这里对于SVHN数据集,层数更多的DenseNet-BC的结果并没有层数少的DenseNet (k = 24) 的效果好,作者认为原因主要是SVHN这个数据集相对简单,更深的模型容易过拟合。在表格的倒数第二个区域的三个不同深度L和k的DenseNet的对比可以看出随着L和k的增加,模型的效果是更好的。
下图是DenseNet-BC和ResNet在Imagenet数据集上的对比,左边那个图是参数复杂度和错误率的对比,右边是flops和错误率的对比。
下图中,左边的图表示不同类型DenseNet的参数数量和错误率的对比。中间的图表示DenseNet-BC和ResNet在参数数量和错误率的对比,相同错误率下,DenseNet-BC的参数复杂度要小很多。右边的图也是表达DenseNet-BC-100只需要很少的参数就能达到和ResNet-1001相同的结果。