DenseNet 笔记

DenseNet早在2016年8月份就挂在 arXiv 上,获得 CVPR 2017 最佳论文。

什么是 DenseNet?

DenseNet,英文全称 Dense Convolutional
Network,是一组具有密集连接的卷积神经网络。DenseNet 的设计受 ResNet 跨层连接的思想启发,在一个 Dense Block 中,任何两层之间都有直接的连接。 有所不同的是,网络每一层的输入都是前面是所有层输出的并集,而不是相加。图1 是一个 5 层的Dense Block 示意图,如下:



图1 5层的Dense Block,k=4

记第 $l$ 层的变换函数为 $H_{l}$ (通常对应一组 BN-ReLU-Convolution(3*3) 的操作),输出为 $x_{l}$,可以用一个简单的式子描述每一层的变换:
$$
x_{l}=H_{l}([x_{0},x_{1},\cdots,x_{l-1}])
$$

如果一个 $H_{l}$ 产生 $k$ 个特征图,
如果一开始输入的通道数为 $k_{0}$,那么第 $l$ 层输出的通道数就是 $k_{0} + k \times l$。这里的超参数 $k$ 又被称作 Growth Rate。

作者认为池化层很重要,可以改变特征图的大小,而一个 Dense Block 内部的特征图的尺寸不能改变,为了用上池化层,将网络分成多个 Dense Block,彼此之间加入一个 Transition Layer(对应一组 BN-Conv(1*1)-Average Pooling(2*2 )的操作)。

一个典型的 DenseNet 结构如下图所示:



图2 包含3个 Dense Blocks 的 DenseNet

尽管每一层操作产生 $k$ 个特征图,还是有很多输入。因此引入 1*1 卷积作为 Bottlenect Layer 进行通道降维。这样 $H_{l}$ 就变成 BN-ReLU-Conv(1*1)-BN-ReLU-Conv(3*3),每个 1*1 卷积产生 $4k$ 个特征图。

为了使模型更加紧凑,在 Transition Layer 也可以进行特征图通道数降维。如果一个 Dense Block 包含 $m$ 个特征图,则生成 $\lfloor \theta m \rfloor$ 个特征图,其中 $0 < \theta \le 1$,实验中作者把这个参数设为 0.5 。

为什么会有Densenet?

文献[4] 中作者进行了一个随机深度网络的工作。主要想法是提出一种类似于 Dropout 的方法来改进 ResNet。在训练的过程中随机地扔掉一些层,能够显著地提高 ResNet 的泛化能力。这个工作有两点启发:

  • 它说明了神经网络其实并不一定要是一个递进层级结构,也就是说网络中的某一层可以不仅仅依赖于紧邻的上一层的特征,而可以依赖于更前面层学习的特征;
  • 在训练的过程中随机扔掉很多层也不会破坏算法的收敛,说明了 ResNet 具有比较明显的冗余性,网络中的每一层都只提取了很少的特征(即所谓的残差)。

基于上面两点的观察,DenseNet 中每一层都直接与前面层连接,实现特征的重复利用,同时把网络的每一层设计得特别窄,即只学习非常少的特征图,达到降低冗余性的目的。

DenseNet 有什么优缺点?

省参数和计算量。 DenseNet 比其他网络效率更高,其关键就在于网络每层计算量的减少以及特征的重复利用。DenseNet 的每一层只需学习很少的特征,使得参数量和计算量显著减少。

抗过拟合。 DenseNet 具有非常好的抗过拟合性能,尤其适合于训练数据相对匮乏的应用。对于 DenseNet 抗过拟合的原因有一个比较直观的解释:神经网络每一层提取的特征都相当于对输入数据的一个非线性变换,而随着深度的增加,变换的复杂度也逐渐增加(更多非线性函数的复合)。相比于一般神经网络的分类器直接依赖于网络最后一层(复杂度最高)的特征,DenseNet 可以综合利用浅层复杂度低的特征,因而更容易得到一个光滑的具有更好泛化性能的决策函数。

DenseNet 训练特别耗费显存。 但是文献[5]已解决这一问题。

参考资料

请作者吃酒!