2.1.10 DenseNet
DenseNet(稠密连接网络)(Huang et al.,2017)的目的也是缓解梯度消失,其获得了2017年CVPR 最佳论文奖。如图2-14所示,和ResNet的残差模块不同,稠密连接(Dense)模块中任意两层之间均有短路连接,训练时梯度可以更直接地进行传播。也就是说,每一层的输入通过特征拼接的形式包含了之前所有层的特征,对于一个层的DenseNet,共包含
个短路连接。

图2-14 DenseNet 网络结构图
形式化地假设第个模块的输入特征为
,输出特征为
,ResNet中的残差模块是将残差分支的输出
加上短路分支的输出
,作为模块整体输出特征:

(2.3)
而在DenseNet中,第个模块会以之前所有模块的特征作为输入,模块输出特征为

(2.4)
其中,是输入层(即图像)的特征。当
比较大时,由于第
个模块的输入以特征拼接的形式包含了之前所有模块的特征,所以第
个模块的输入特征通道数会很大,这会使得第
个模块中的卷积层参数量和计算量都很大。因此,DenseNet中的
实际包括了BN层+ReLU层+
卷积层+BN层+ReLU层+
卷积层,其中,
卷积层的作用是对第
层的输入特征进行降维,这样可以降低整体的参数量和计算量。
为了能进行特征拼接,特征需要保持相同的空间维度,而卷积神经网络中会随着层数加深逐渐降低特征空间维度。因此 DenseNet 整体网络结构采用了DenseBlock+Transition+DenseBlock+Transition+
的形式,每个DenseBlock 内部特征维度相同,相互之间采用稠密连接形式(见图2-14),而在Transition 内会通过平均汇合层降低特征空间维度。
DenseNet 通过拼接不同层特征达到特征重用(Feature Reuse)的效果,和之前方法不同的是,DenseNet中的卷积层只需要很少的卷积核数目(对应输出通道数)。整体上,DenseNet 只用ResNet 一半的参数量即可达到 ResNet的性能。但在实现方面,直接将特征拼接会占用很大的GPU 显存,后来通过共享存储(Pleiss et al.,2017),可以在相同的GPU 显存资源下训练更深的DenseNet,但由于有些中间结果需要重复计算,该实现会增加一些训练时间。