这篇文章是Densely Connected Convolutional Networks的解读,在精简部分内容的同时补充了相关的概念。如有错误,敬请指正。
论文地址:https://arxiv.org/abs/1608.06993
代码地址:https://github.com/liuzhuang13/DenseNet
最近在卷及网络方面的进展显示,如果在深层网络中的输入和输出层中加入shortcut连接,会提高正确率和训练效率。根据这一发现,我们提出了一种新的网络结构:DenseNet,以前馈的方式来将每一层和其他所有层连接起来。对于每一层来说,之前所有层的feature maps都将作为输入;同时这一层的feature map将会作为之后所有层的输入。DenseNet有如下优点:减轻了梯度消失的现象;强化了特征传播;高效地重复使用特征;减少了参数的数量。
当CNN网络深度剧增时,梯度消失的问题凸显出来。ResNet和Highway Networks通过恒等映射将信号传递到更深层的网络。有许多方法对ResNet进行了改进,这些方法虽然在网络拓扑结构,训练方法上有所差异,但实质上有一个重要的共性:在层间进行shortcut连接。
本文将这种思想作了进一步升华:在层间保证最大的信息流动,即将所有层直接连接起来。Figure 1. 展示了这种结构。
与深层网络优化相关的工作有:
DenseNet的创新在于,不是简单地通过加深网络层数或者拓展单层的宽度来获得新的网络架构,而是通过特征重用(feature reuse)来获得很高的参数利用率。
假设图像输入为 x0 ,网络由 L 层,每一层都包含一个非线性变换 Hℓ(⋅) ,这个非线性变换可以是BN,ReLU,Pooling,或者卷积层。设第 ℓ 层的输出为 xℓ 。
ResNet在原始网络的基础上增加了一个恒等映射:
xℓ=Hℓ(xℓ−1)+xℓ−1
ResNet的优点是,在反向传播的时候,靠后层的梯度可以通过恒等映射直接传导到之前的层。但是注意恒等映射 xℓ−1 和 Hℓ 是直接相加的,这可能导致对信息传递的阻碍。
为了提高信息在层间的传递,我们将每一层和其他的层直接连接起来。此时,第 ℓ 层接收到之前所有层的特征图作为输入:
xℓ=Hℓ([x0,x1,...,xℓ−1])
为方便实现,将多重输入 [x0,x1,...,xℓ−1] 连接成一个张量。
将 Hℓ 定义成一个复函数,包含BN,ReLU和一个 3×3 卷积。
以上公式中使用的连接操作在特征图大小改变的时候将变得不可行。而卷积中的down-sampling操作又正好会改变特征图的大小。为了解决这个问题,将网络变成多个密集连接的dense blocks,如下图:
如果每一个 Hℓ 产生 k 个特征图,那么第 ℓ 层将会有 k0+k×(ℓ−1) 个输入特征图。其中, k0 是输入层的通道数。将超参数 k 定义为网络的增长率(growth rate)。在接下来的章节中可以看到,使用一个小的增长率,已经可以实现很好的正确率。因为每一层都和之前的层有所联系,因此每一层也都能共享网络的公有知识(collective knowledge)。
1∗1 卷积可以当做一个bottleneck层来使用。在 3∗3 卷积之前引入,可以降低输入特征图的数量,以提高计算效率。在试实验中,使用 BN−ReLU−Conv(1×1)−BN−ReLU−Conv(3×3) 的网络结构,并且每一个 1×1 卷积产生 4×k 个特征图,将这种网络结构定义为DenseNet-B。
为了使模型更加紧凑,可以减少transition layers中的特征图数量。如果一个dense block中有 m 个特征图,可以令紧接着的transition layer生成 [θm] 个特征图,其中 [0<θ<1] 为压缩率。当 θ=1 的时候,经过transition layer的特征图数量不变。当 θ<1 时。将相应的网络定义为DenseNet-C(在实验中设置 θ=0.5 )。当使用bottleneck并且transition layers的 θ<1 时,定义为DenseNet-BC。
除开ImageNet,在实验中使用的DenseNet都有三个dense block,每一个都有相同数量的layer。在输入数据进入第一个dense block之前,会首先经过一个有16(对于DenseNet-BC,数量是增长率的两倍)个输出通道的卷积层。卷积核的大小为 3×3 ,使用zero-padded来保持特征图大小固定。在最后一个dense block,使用global average pooling,紧接着使用一个softmax分类器。对于三个不同的dense block,分别使用 32×32 、 16×16 、 8×8 的特征图大小。实验中使用如下几种配置:
{L=40,k=12} 、 {L=100,k=12} 、 {L=100,k=24} 。对于DenseNet-BC,以下配置:
{L=100,k=12} 、 {L=250,k=24} 、 {L=190,k=40} 也进行了实验。
在ImageNet上,使用了如下的DenseNet-BC结构:
4个dense block, 224×224 个输入图像。初始的卷积层由 2×k 个卷积组成,大小为 7×7 ,步长为2。其他所有层的特征图数量为 k 。具体细节详见Table1。
在CIFAR和SVHN数据集上的实验结果如下:
使用不同的深度 L 和增长率 k 来训练网络。结果详见Table 2。注意到DenseNet-BC( L=190 , k=40 ),在CIFAR数据集上的正确率很高。在SVHN上,使用dropout方法的DenseNet( L=100 , k=24 )也超过ResNet的最好记录。但是,250层的DenseNet-BC正确率不高,原因可能是SVHN在这种极深的网络上发生了过拟合。
250层的DenseNet模型仅仅有15M参数,正确率高于有30M参数的FractalNet和Wide ResNets。Figure 3给出了ResNet和DenseNet-BC的比较。
FIgure 4给出了在ImageNet上的详细测试结果:
因为DenseNet中使用了密集连接的方式,特征图能被所有层共享,提高了特征重用的效率,也使得模型更加紧凑。从FIgure 4中可以发现,对于6%左右的测试误差,DenseNet的参数为ResNet的三分之一。对于性能相似的ResNet-1001和DenseNet-100,前者参数数量为10M,后者仅为0.8M。
DenseNet正确率提高的一种解释是,每一层通过shortcut收到了来自损失函数的额外监督(additional supervision)。关于deeply-supervised nets(DSN)的解释可见1,DSN在每一个隐层中都使用了分类器,使中间层学习分类特征。
DenseNet使用一种隐式的deep supervision策略,即只在网络终端使用一个单独的分类器来直接监督所有的层。但是相对DSN来说,DenseNet的损失函数和梯度要相对简单一些,因为所有的层都共享一个损失函数。
DenseNet的网络结构允许每一层利用之前层的特征。可以设计实验来验证这一点,在C10+数据集上使用 L=40 、 k=12 的DenseNet,对于每一个block中的卷积层 ℓ ,计算被分配给 s 层的平均权重。Figure 5 给出了3个Dense block的图示。 平均绝对权重代表了卷积层对之前层的依赖性。位置 (ℓ,s) 处的红点表示, ℓ 层大量使用了 s 层产生的特征图。