近来的工作证明,卷积网络深度越深,准确率就越高,而如果再加上一些 short connections 将靠近输入和输出的层连接起来,训练起来可以更高效。在这篇论文中,我们借由此发现,提出了 Dense Convolutional 网络(DenseNet),它将每一层和其他层通过前馈的方式连接。传统的网络假如有 L L L 层,它就有 L L L 个连接,每一层都和它后面的那一层直接连接,而我们的网络有 L ( L + 1 ) 2 \frac{L(L+1)}{2} 2L(L+1)个连接。每一层都把它前面所有层的特征图当做输入,而它自己的特征图则作为它后面的所有层的输入。DenseNet有多个优势:它们缓解了梯度消失的问题,增强了特征传播,鼓励特征再利用,极大地降低了参数个数。我们在4个目标识别基准(Cifar-10,Cifar-100,SVHIN,ImageNet)上做了测试。DenseNet 相较于目前的 state of the art 的方法取得了显著的提升,而它的计算量更低。
卷积神经网络(CNNs)在目标识别任务上已经成为主流的机器学习方法。尽管CNN的历史已有20年之久,但直到最近才因为电脑硬件和网络结构的提升,CNN才能够有效地训练起来。起初的 LeNet5 只有5层,VGG 也只有19层,直到2016年,Highway Network 和 ResNet 才使得网络突破100层。
随着CNN变得越来越深,一个新的研究课题就出现了:当输入和梯度信息沿着网络层传递时,该信息最后可能消失。最近很多论文都在讨论如何解决这个问题或相关问题。ResNets 和 Highway Networks 将信号通过 identity connections 从一层传递到下一层。Stochastic depth 在训练中随机丢弃一些层,缩小 ResNets,从而让信息和梯度更好地传递。FractalNets 将多个平行的层序列和不同个数的卷积模块重复连接,让深度看上去显得更深,在网络中也保留了许多 short paths。尽管这些方法在网络的拓扑结构和训练过程上不同,它们都有一个关键特点:在前面的层和后面的层之间构建 short paths。
在这篇论文我们提出了一个网络结构,将上面的想法蒸馏为一个简单的 connectivity pattern:为了确保各层之间流动信息的最大化,我们将所有层(特征图大小要匹配)都直接和其它层连起来。为了保留前馈的本质,每层都从之前所有的层取得输入,然后将它自己的特征图再传递给后续所有的层。图1展示了该网络结构。和 ResNets 不同,在特征传递到下一层之前,我们没有用 summation 将特征结合起来;相反,我们通过 concatenation 将它们结合起来。因此,第 l l l层就有 l l l个输入,它由之前所有卷积模块的特征图组成。它自己的特征图则传递到后续的 L − l L-l L−l个层。这样在 L L L层的网络中,一共有 L ( L + 2 ) 2 \frac{L(L+2)}{2} 2L(L+2)个连接。而在传统的网络结构中,只有 L L L个连接。因为它具有 dense connectivity 的模式,我们将该方法称为 Dense Convolutional Network, DenseNet。
此 dense connectivity pattern 和传统卷积网络相比,参数个数要少很多,这是因为它无需重复学习冗余的特征图。传统的前馈结构可以看作为带有一个 state 的算法,该 state 从一层传递到下一层。每层从上一层读取 state,然后写给下一层。它会改变这个 state,但也将需要保留的信息传递下去。ResNets 通过恒等变换显式地将此信息保留。最近有人对 ResNets 做了改动,他们发现网络里的许多层其实贡献很少,这些层可以在训练过程中丢掉。这就让 ResNets 的 state 和递归神经网络RNN类似,但是 ResNets 因为自身的权值,参数个数要多得多。DenseNet 结构可以明显地区分出添加到网络的信息和保留的信息。DenseNet 层非常的窄(每层只有12个滤波器),只增加了很少的特征图,而没有更改任何其余的特征—最后的分类器基于所有的特征图来做决定。
除了参数效率更高,DenseNets 的另一个优势就是信息和梯度可以更好地在网络中流动。每一层都可以直接获取损失函数的梯度以及原始的输入信号,实现隐式的深度监督学习。这有助于训练更深的网络结构。此外,我们发现 dense connections 有正则化的作用,在小训练集上降低过拟合。
我们在4个基准数据集上做了测试(Cifar-10,Cifar-100,SVHIN,ImageNet)。与现有的方法比较,我们的模型需要的参数量更少,而准确率差不多。而且,在绝大多数的基准任务上,我们的方法都比 state of the art 的方法好很多。
网络结构的探索已经成为神经网络研究的一部分。现代网络中层数不断增加,扩大了各网络之间的差异,促进人们去探索不同的连接模式,重新学习旧的研究思想。
在1980年代,就已经有人提出了一个类似于我们的 dense network 的级联结构。他们的工作关注在全连接多层感知机上,逐层地训练。然后,有人提出了利用批梯度下降来训练全连接级联网络。尽管在小数据集上有用,这个方法只对有几百个参数的网络有效。另一些论文中,他们通过 skip-connections 利用 CNN的多层级特征,进行视觉任务。
Highway Networks 首先提供了一种方法,高效率地、端到端地训练层数超过100层的网络。通过 bypassing paths 和 gating units,有几百层的 Highway Networks 可以没有任何难度地进行优化。Bypassing paths 是这些超深网络能够训练的关键因素。在 ResNets中,使用纯恒等映射作为 bypassing paths。ResNet 在许多的图像识别、定位、检测任务上取得了优异、破纪录的表现。最近,有人提出了 stochastic paths,成功训练了一个1202层的ResNet。Stochastic depth 在训练过程中随机丢弃一些层,从而提升深度残差网络的训练。这就说明,在训练中并不是所有的层都是需要的,在深度残差网络中有很多的冗余存在。使用 pre-activation,ResNets 也可促进1000层以上的网络的训练。
让网络更深(比如有 skip connections 的帮助)的一个正交方法就是增加网络的宽度。GoogLeNet 使用“Inception Module”,该 module 将不同大小滤波器输出的特征图 concatenate 起来。在“Resnet in resnet: Generalizing residual architectures” 中,提出了一个ResNets的变形,其中残差模块比较宽。事实上,简单地增加ResNet各层中滤波器的个数就能够提升模型表现,只要深度足够。FractalNets 通过较宽的网络结构也取得了优异的成绩。
DenseNet 没有利用很深或很宽的结构来获取表现力,而是通过“特征再利用”来挖掘网络的潜力,产生容易训练和参数高效的浓缩模型。将不同层学到的特征图 concat 起来,可以增加后面层输入的差异性,提升效率。这是 ResNets 和 DenseNets 的主要不同。和 Inception 网络相比,它也将不同层的特征 concat 起来,DenseNets 的做法要更简单、更高效一些。
其他的一些网络结构创新也有不错的效果。Network in Network 结构在卷积层中包含微型的多层感知机,提取更多复杂的特征。在 Deeply Supervised Network 中,内部层由辅助分类器直接地监督,这有助于网络前面的层接收梯度。Ladder Networks 在 autoencoders 中增加了 lateral connection,在半监督学习任务上取得不错的准确率。Deeply-Fused Nets 将不同 base 网络的中间层结合起来,促进信息流动。用 pathways 来增强网络,降低重建的损失,这也被证明可以改善图像分类模型。
假设我们有一张图片 x 0 x_0 x0,输入进一个卷积网络。网络有 L L L层,每一层都使用了非线性变换 H l ( ⋅ ) H_l(\cdot) Hl(⋅), l l l表示层的序列号。 H l ( ⋅ ) H_l(\cdot) Hl(⋅)可以是一个复合函数操作,如BN, ReLU, Pooling,或卷积。我们将第 l l l层的输出表示为 x l x_l xl。
ResNets. 传统的卷积前馈网络将第 l l l层的输出作为输入传递进第 l + 1 l+1 l+1层,就有下面的层变换: x l = H l ( x l − 1 ) x_l=H_l(x_{l-1}) xl=Hl(xl−1)。ResNets 增加了一个 skip-connections,通过一个恒等函数越过非线性变换:
x l = H l ( x l − 1 ) + x l − 1 x_l = H_l(x_{l-1}) + x_{l-1} xl=Hl(xl−1)+xl−1
ResNets的一个优势就是,梯度能通过恒等映射直接从较后面的层传到前面的层。但是,恒等映射和 H l H_l Hl的输出是通过 summation 结合的,这有可能阻碍信息在网络中的流动。
Dense connectivity. 为了进一步提升不同层之间信息的流通,我们提出了一个新的 connectivity pattern:在每一层和之后所有的层之间建立直接连接。图1展示了DenseNet的网络结构。因此,第 l l l层接收的特征图来自之前所有的层, x 0 , . . . , x l − 1 x_0,...,x_{l-1} x0,...,xl−1:
x l = H l ( [ x 0 , x 1 , . . . , x l − 1 ] ) x_l = H_l ([x_0, x_1,...,x_{l-1}]) xl=Hl([x0,x1,...,xl−1])
其中, [ x 0 , x 1 , . . . , x l − 1 ] [x_0, x_1,...,x_{l-1}] [x0,x1,...,xl−1]表示各层( 0 , . . . , l − 1 0,...,l-1 0,...,l−1)特征图的 concatenation。因为这种 dense connectivity, 我们称此网络为 DenseNet。为了让实现变得简单,我们将上面等式 H l ( ⋅ ) H_l(\cdot) Hl(⋅)的多个输入 concat 起来,作为一个张量。
复合函数. 我们将 H l ( ⋅ ) H_l(\cdot) Hl(⋅)定义为一个复合函数,它由三个连续的操作构成:BN, ReLU, 和 3 × 3 3\times 3 3×3卷积。
池化层. 如果特征图大小不同,上面等式中用到的 Concat 操作就不能使用。但是,卷积网络的一个核心组成就是下采样层,它能改变特征图的大小。为了能在网络中使用下采样,我们将网络分为多个密集连接的 dense blocks,如图2。我们将每个 block 之间的层称为 transition layers,进行卷积和池化操作。Transition layers 由一个 BN 层、一个 1 × 1 1\times 1 1×1卷积层以及一个 2 × 2 2\times 2 2×2的池化层构成。
Growth rate. 如果每个函数 H l H_l Hl产生 k k k个特征图,第 l l l层就有 k 0 + k × ( l − 1 ) k_0 + k\times (l-1) k0+k×(l−1)个输入特征图, k 0 k_0 k0是输入层的通道数。DenseNet 和现有的网络结构一个重要区别就是,DenseNet 可以有非常狭窄的层,比如 k = 12 k=12 k=12。我们将这个超参数 k k k称为网络的 growth rate。在第四节,我们将证明较小的 growth rate 够用了。这是因为,每一层都可以获得该 block 里前面层的特征图,也就是可以获得整体网络的 “collective knowledge”。人们可以将特征图看作为该网络的 global state。每一层都向这个 state 写入 k k k个特征图。Growth rate 控制着每一层向这个 state 写入新信息的量。Global state 一旦写好,就可以从网络的任何位置获取它,而不是像传统的网络结构,你要在层与层之间复制它。
Bottleneck layers. 虽然每一层只产生 k k k个输出特征图,但它通常有非常多的输入。在许多文献中都有提到,我们在每个 3 × 3 3\times 3 3×3卷积之前使用 1 × 1 1\times 1 1×1卷积,作为 bottleneck 层,降低输入特征图的个数,提升卷积效率。我们这个设计对于 DenseNet 尤其有效,我们将加入了 bottleneck 层(BN-ReLU-Conv( 1 × 1 1\times 1 1×1)-BN-ReLU-Conv( 3 × 3 3\times 3 3×3))的 DenseNet 称为 DenseNet-B。在试验中,我们让每个 1 × 1 1\times 1 1×1卷积输出4000个特征图。
Compression. 为了进一步提升模型简洁性,我们可以在 transition layers 中降低特征图的个数。如果一个dense block 包含 m m m个特征图,我们让随后的 transition layer 产生 ⌊ θ m ⌋ \lfloor \theta m \rfloor ⌊θm⌋个输出特征图,其中 0 < θ ≤ 1 0<\theta \leq 1 0<θ≤1 作为压缩乘数、当 θ = 1 \theta=1 θ=1时,特征图的个数保持不变。我们将 θ < 1 \theta<1 θ<1的DenseNet称作 DenseNet-C,在试验中我们设 θ = 0.5 \theta=0.5 θ=0.5。如果我们既用了 bottleneck 也用了 transition layer ( θ < 1 \theta<1 θ<1),我们就将之称为 DenseNet-BC。
实现细节. 在所有的数据集上,除了ImageNet,DenseNet 都有三个 dense blocks,每一个都有着相同的层数。在进入第一个 dense block之前,我们先对输入图像进行一个输出通道数为16(或是两倍于 DenseNet-BC的 growth rate)的卷积操作。对于卷积核大小为 3 × 3 3\times 3 3×3的卷积层,输入的每一边都进行了一个像素点的 zero-padding,保持特征图大小不变。在两个连续的 dense blocks 之间,我们用 1 × 1 1\times 1 1×1卷积和 2 × 2 2\times 2 2×2 average pooling 作为 transition layers。在最后一个 dense block末尾,执行一个 global average pooling 操作,然后是一个 softmax 分类器。三个 dense blocks 的特征图大小分别是 32 × 32 , 16 × 16 , 8 × 8 32\times 32, 16\times 16, 8\times 8 32×32,16×16,8×8。对于基本的DenseNet,我们用如下配置进行试验: { L = 40 , k = 12 } , { L = 100 , k = 12 } , { L = 100 , k = 24 } \{L=40,k=12\},\{L=100,k=12\},\{L=100,k=24\} {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 } \{L=100,k=12\},\{L=250,k=24\},\{L=190,k=40\} {L=100,k=12},{L=250,k=24},{L=190,k=40}。
在ImageNet的实验中,对于 224 × 224 224\times 224 224×224的输入图像,DenseNet-BC 有4个 dense blocks。初始卷积层有2000个大小为 7 × 7 7\times 7 7×7、步长为2的卷积组成。所有其他层的特征图个数延续 k k k的设定。ImageNet上总体的网络结构如表1所示。
Pls read paper for more details.