转载知乎https://zhuanlan.zhihu.com/p/31647627
摘要
最近的研究表明,如果在靠近输入层与输出层之间的地方使用短连接(shorter connections),就可以训练更深、更准确、更有效的卷积网络。在这篇文章中,我们基于这个观点,介绍了稠密卷积网络(DenseNet),该网络在前馈时将每一层都与其他的任一层进行了连接。传统的 层卷积网络有 个连接——每一层与它的前一层和后一层相连——我们的网络有 个连接。每一层都将之前的所有层的特征图作为输入,而它自己的特征图是之后所有层的输入。DenseNets有一些很不错的优点:有助于解决梯度消失问题,有利于特征传播,鼓励特征的重复利用,还可以减少参数量。我们在四个目标检测任务(CIFAR-10,CIFAR-100,SVHN和ImageNet)中验证了我们提出了结构。DenseNets在这些数据集上大都有较大的提高,而且使用更少的计算量就可以获得更好的性能。
1. 介绍
在视觉检测任务中,卷积神经网络(CNNs)已经成为占有绝对优势的机器学习方法。尽管它们在20年前就已经被提出来,但是计算机硬件和网络结构的改善才使训练深层的卷积网络在最近成为现实。起初的LeNet5有5层,VGG有19层,只有去年的Highway网络和ResNets网络才克服了100层网络的障碍。
随着CNNs变得越来越深,一个新的问题出现了:当输入或梯度信息在经过很多层的传递之后,在到达网络的最后(或开始)可能会消失或者“被冲刷掉”(wash out)。很多最新的研究都说明了这个或者与这个相关的问题。ResNets网络和Highway网络将旁路信息(bypass signal)进行连接。随机深度(stochastic depth)在训练过程中随机丢掉一些层,进而缩短了ResNets网络,获得了更好的信息和梯度流。FractalNets使用不同数量的卷积block来重复的连接一些平行层,获得更深的网络同时还保留了网络中的short paths。尽管这些方法在网络结构和训练方法等方面有所不同,但它们都有一个关键点:它们都在前几层和后几层之间产生了短路径(short paths)。
在这篇文章中,我们提出了一个结构,该结构是提炼上述观点而形成的一种简单的连接模式:为了保证能够获得网络层之间的最大信息,我们将所有层(使用合适的特征图尺寸)都进行互相连接。为了能够保证前馈的特性,每一层将之前所有层的输入进行拼接,之后将输出的特征图传递给之后的所有层。结构如图1所示。
重要的一点,与ResNets不同的是,我们不是在特征传递给某一层之前将其进行相加(combine),而是将其进行拼接(concatenate)。因此,第 层有 个输入,这些输入是该层之前的所有卷积块(block)的特征图,而它自己的特征图则传递给之后的所有 层。这就表示,一个 层的网络就有 个连接,而不是像传统的结构仅仅有 个连接。由于它的稠密连接模块,所以我们更喜欢把这个方法称为稠密卷积网络(DenseNets)。
该稠密连接模块的一个优点是它比传统的卷积网络有更少的参数,因为它不需要再重新学习多余的特征图。传统的前馈结构可以被看成一种层与层之间状态传递的算法。每一层接收前一层的状态,然后将新的状态传递给下一层。它改变了状态,但也传递了需要保留的信息。ResNets将这种信息保留的更明显,因为它加入了本身的变换(identity transformations)。最近很多关于ResNets的研究都表明ResNets的很多层是几乎没有起作用的,可以在训练时随机的丢掉。这篇论文[21]阐述了ResNets很像(展开的)循环神经网络,但是比循环神经网络有更多的参数,因为它每一层都有自己的权重。我们提出的DenseNet结构,增加到网络中的信息与保留的信息有着明显的不同。DenseNet层很窄(例如每一层有12个滤波器),仅仅增加小数量的特征图到网络的“集体知识”(collective knowledge),并且保持这些特征图不变——最后的分类器基于网络中的所有特征图进行预测。
除了具有更好的参数利用率,DenseNets还有一个优点是它改善了网络中信息和梯度的传递,这就让网络更容易训练。每一层都可以直接利用损失函数的梯度以及最开始的输入信息,相当于是一种隐形的深度监督(implicit deep supervision)。这有助于训练更深的网络。此外,我们还发现稠密连接有正则化的作用,在更少训练集的任务中可以降低过拟合。
我们在四个目标检测任务(CIFAR-10,CIFAR-100,SVHN和ImageNet)中验证了DenseNets。在和现有模型有相似准确率的前提下,我们的模型有更少的参数。此外,我们的网络还超过了目前在大部分的检测任务都有最好结果的算法。
2. 相关工作
自从神经网络被提出之后,网络结构的探索就成为了神经网络研究的一部分。最近神经网络的广泛关注也给这个研究领域注入了新的生机。网络层数的增加也让更多的人进行结构的改善、不同连接模式的探索、早期研究观点的复现等方面的研究。
在1980s神经网络论文中提出的级联结构很像我们提出的稠密网络。他们之前的工作主要关注在全连接的多层感知机上。最近,使用批梯度下降训练的全连接的级联网络也被提出来了。尽管在小数据集上有效,但该方法的网络却有几百个参数。[9,23,30,40]提出在CNNs中利用跨层连接获得的多种特征,这已经被证明在很多视觉任务上有效。和我们的工作类似,[1]使用和我们相似的跨层连接方式提出了一种纯理论的网络框架。
HighWay是这些网络中第一个提出使用100多层的结构训练一个端到端的网络。使用旁路(bypassing paths)和门控单元(gating units),HighWay网络可以很轻松的优化上百层的网络。旁路被认为是使深层网络容易训练关键因素。该观点在ResNets中被进一步证实,ResNets使用本身的特征图作为旁路。ResNets在很多图像识别、定位和检测任务(如ImageNet和COCO目标检测)中都获得了不错的效果,并且还打破了之前的记录。最近,一种可以成功训练1202层ResNet的随机深度(stochastic depth)被提出。随机深度通过在训练过程中随机丢掉一些层来优化深度残差网络的训练过程。这表明深度(残差)网络中并不是所有的层都是必要的,有很多层是冗余的。我们论文的一部分就受到了该结论的启发。预激活(pre-activation)的ResNets也有助于训练超过1000层的网络。
一种让网络更深(如跨层连接)的正交法(orthogonal approach)是增加网络的宽度。GooLeNet使用了“inception”模块,将不同尺寸的滤波器产生的特征进行组合连接。在[37]中,提出一种具有广泛宽度的残差模块,它是ResNets的一种变形。事实上,只简单的增加ResNets每一层的滤波器个数就可以提升网络的性能。FractalNets使用一个宽的网络结构在一些数据集上也获得了不错的效果。
DenseNets不是通过很深或者很宽的网络来获得表征能力,而是通过特征的重复使用来利用网络的隐含信息,获得更容易训练、参数效率更高的稠密模型。将不同层学到的特征图进行组合连接,增加了之后层输入的多样性,提升了性能。这同时也指出了DenseNets和ResNets之间的主要差异。尽管inception网络也组合连接了不同层的特征,但DenseNets更简单,也更高效。
也有很多著名的网络结构获得了不错的结果。NIN结构将多层感知机与卷积层的滤波器相连来提取更复杂的特征。在DSN中,通过辅助分类器来监督内部层,加强了前几层的梯度。Ladder网络将横向连接(lateral connection)引入到自编码器中,在半监督学习任务中获得不错的效果。在[38]中,DFNs通过连接不同基础网络的中间层来改善信息的传递。带有可以最小化重建损失路径(pathways that minimize reconstruction losses)的网络也可以改善图像分类模型的性能。
3. DenseNets
假设一张图片 在卷积网络中传播。网络共有 层,每一层都有一个非线性转换 ,其中 表示层的维度(即第几层)。 是一个组合函数,有BN、ReLU、池化或卷积。我们用 表示 层的输出。
ResNets。传统的前馈网络是将 层的输出作为 层的输入,可用该方程来表示: 。ResNets增加了一个跨层连接,将自身与非线性转换的结果相加:
ResNets的一个优点是可以直接将梯度从后层传向前层。然而,自身与经过 得到的输出是通过求和的形式来连接的,这可能使网络中信息的传播受到影响。
稠密连接。为了更好的改善层与层之间信息的传递,我们提出一种不同的连接模式:将该层与之后的所有层进行连接,如图1所示。因此, 层将之前所有层的特征图 作为输入:
其中 表示第 层输出的特征图的进行拼接。由于它的稠密连接模式,我们称该网络结构为稠密卷积网络(DenseNet)。为了便于表达,我们把方程(2)中 的多个输入表示为一个向量。
组合函数。受[12]的启发,我们将 定义为三种操作的组合函数,分别是:BN、ReLU和3x3卷积。
池化层。当特征图的尺寸改变时,方程(2)中连接操作就会出现问题。然而,卷积网络有一个基础的部分——下采样层,它可以改变特征图的尺寸。为了便于下采样的实现,我们将网络划分为多个稠密连接的dense block,如图2所示。
我们将每个block之间的层称为过渡层,完成卷积和池化的操作。在我们的实验中,过渡层由BN层、1x1卷积层和2x2平均池化层组成。
增长速率(growth rate)。如果每个函数 都产生 个特征图,之后的 层就有 个特征图作为输入,其中 表示该层的通道数。DenseNet和现存网络结构的一个很重要的不同是,DenseNet的网络很窄,如 。我们将超参数 称为网络的增长速率。我们会在文章的第4部分进行说明,一个很小的增长速率在我们测试的数据集上就可以获得不错的效果。这种情况的一种解释是,每一层都可以和它所在的block中之前的所有特征图进行连接,使得网络具有了“集体知识”(collective knowledge)。可以将特征图看作是网络的全局状态。每一层相当于是对当前状态增加 个特征图。增长速率控制着每一层有多少信息对全局状态有效。全局状态一旦被写定,就可以在网络中的任何地方被调用,而不用像传统的网络结构那样层与层之间的不断重复。
Bottleneck层。尽管每一层只产生 个输出特征图,但它却有更多的输入。在[36,11]中已经说明可以在bottleneck层中3x3的卷积之前加入1x1的卷积实现降维,可以减小计算量。我们发现这种设计对DenseNet极其有效,我们将具有bottleneck层,即BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3)的结构称为DenseNet-B。在我们的实验中,我们令1x1的卷积生成 个特征图。
Compression。为了简化模型,我们在过渡层中减小了特征图的数量。如果一个dense block有 个特征图,我们让之后的过渡层生成 个输出特征图,其中 表示compression系数。当 时,经过过渡层的特征图数量没有改变。我们定义 的DenseNet为DenseNet-C,并且在我们的实验中 。如果bottleneck和过渡层都有 ,我们称该模型为DenseNet-BC。
实现细节。在除了ImageNet外的所有数据集上,我们实验中使用的DenseNet都有三个dense block,每一个block都有相同的层数。在进入第一个dense block之前,输入图像先经过了16个(DenseNet-BC中是两倍的增长速率)卷积。对于3x3的卷积层,使用一个像素的零填充来保证特征图尺寸不变。在两个dense block之间的过渡层中,我们在2x2的平均池化层之后增加了1x1的卷积。在最后一个dense block之后,使用全局平均池化和softmax分类器。三个dense block的特征图的尺寸分别是32x32,16x16,8x8。我们改变一些参数 ,在基本的DenseNet上做了一些实验。对于DenseNet-BC,分别设置 。
对于在ImageNet数据集上的实验,我们使用4个dense block的DenseNet-BC结构,图片的输入是224x224。最开始的卷积层有 (64)个卷积,卷积核是7x7,步长是2;其余所有层的特征图都设为 。在ImageNet数据集上的网络如表1所示。
4. 实验
我们在一些检测任务的数据集上证明DenseNet的有效性,并且和现有的一些网络进行了对比,特别是ResNet和它的变形。
4.1 数据集
CIFAR。两种CIFAR数据集都是32x32的彩色图。CIFAR-10(C10)是10类,CIFAR-100(C100)是100类。训练集和测试集分别有50000和10000张图片,我们从训练集中选5000张作为验证集。我们采用在这两个数据集上广泛使用的数据增强方式(镜像/平移)。用在数据集后的“+”来表示使用了这种数据增强方式(如C10+)。至于预处理,我们使用每个颜色通道的均值和标准差来归一化。最后,我们使用全部的50000张训练图片,在训练结束时记录测试误差。
SVHN。SVHN数据集是32x32的彩色数字图。训练集有73257张图片,测试集有26032张,有531131张作为额外的训练。在接下来实验中,我们没有使用任何的数据增强,从训练集中选取6000张图片作为验证集。我们用验证集误差最小的模型来进行测试。我们对像素值执行除255操作,归一化到[0,1]。
ImageNet。ILSVARC 2012分类数据集有1.2百万张训练集,50000张验证集,共1000类。我们采用和论文[8,11,12]同样的数据增强方式,在测试时使用single-crop或10-crop将图片尺寸变为224x224。根据[11,12,13],我们记录了在验证集上的分类误差。
4.2 训练
所有的网络均使用随机梯度下降法(SGD)进行训练。在CIFAR和SVHN数据上,我们令 ,分别训练了300轮和40轮。最初的学习率都为0.1,分别在训练总轮数的50%和75%时,将学习率变为原来的0.1倍。在ImageNet上,我们将模型训练了90轮, 。初始学习率设为0.1,在第30轮和第40轮分别将学习率缩小10倍。受GPU内存的限制,我们设最大的模型(DenseNet-161) 。为了弥补小batch size的不足,我们将模型训练了100轮,并且在90轮时将学习率除以10。
根据[8],我们设置梯度衰减值为10e-4,Nesterov动量设为0.9。我们采用论文[10]中介绍的权重初始化方式。对于三种没有使用数据增强的数据,如C10、C100和SVHN,我们在每个卷积层(除了第一层)之后增加了一层dropout层,并且设置失活率为0.2。对每个任务和每个模型都只进行一次测试。
4.3 在CIFAR和SVHN上的分类结果
我们使用不同的深度( )、不同的增长速率( ),来分别训练DenseNets。在CIFAR和SVHN上的结果如表2所示。为了突出结果,我们对其做了标记,将性能优于现存模型的结果加粗,将该数据集上的最好结果用蓝色标注。
准确率。可能最惹人注目的是表2最后一行的结果,其是 的DenseNet-BC网络在CIFAR上的结果,性能已超过现存的所有模型。在C10+上错误率为3.46%,在C100+上的错误率为17.18%。在C100+上的误差率远低于宽ResNet(wide ResNet)网络。我们在C10和C100(无数据增强)上的误差很喜人:比FractalNet和使用dropout正则项的结果低了接近30%。在SVHN上, 的DenseNet(使用dropout)也远超宽ResNet的最好结果。然而,250层的DenseNet-BC的性能却没有提升太多。这可能是因为SVHN的任务很简单,复杂的模型往往会导致过拟合。
容量(capacity)。不考虑compression或bottleneck层, 和 越大,模型性能越好。我们把这归功于模型容量的增加。这在C10+和C100+这两列中得到了很好的证明。在C10+这列,误差率从5.24%降到了4.10%,最后到了3.74%,因为模型的参数量从1M增加到7M,最后到了27.2M。在C100+这列,我们可以看到相似的结果。这表明DenseNets可以使用更大更深的模型来增加表征能力,也表明它们没有出现过拟合或者残差网络的优化困难等问题。
参数效率。表2的结果表明DenseNets比常见的网络(特别是ResNets)的参数效率更高。使用bottleneck结构并且在过渡层使用降维操作的DenseNet-BC的参数利用率极其高。例如,我们的250层模型只有15.3M的参数量,但是它的性能却远超其他参数量超过30M的模型,像FractalNet和宽ResNets。我们也将 的DenseNet-BC性能与1001层pre-activation的ResNet 进行了比较(如,在C10+的误差 4.51%vs4.62%,在C100+的误差:22.27%vs22.71%)。这两个网络在C10+数据上的训练loss和测试误差如图4(右图)。1001层的深度ResNet收敛到一个更低的loss,但却有相似的测试误差。我们会在接下来对这个内容做更深入的探讨。
拟合能力。更高效利用参数的一个作用是DenseNets不易发生过拟合。在不使用数据增强的数据集上,我们发现到DenseNet结构和之前的工作相比较,其改进还是很明显的。在C10上,误差降了29%,从7.33%降到了5.19%。在C100上,降了大约30%,从28.2%降到了19.64%。通过实验,我们发现一个潜在的过拟合现象:在C10上,通过将 从12增加到24,模型的参数量增加了4倍,而误差却从5.77%增加到5.83%。DenseNet-BC的bottleneck和compression层似乎是应对这种现象的一种有效措施。
4.4 ImageNet分类结果
我们在ImageNet分类任务上测试了不同深度和增长速率的DenseNet-BC的误差,并且和ResNet结构的性能进行了比较。为了对这两种结构有一个公平的比较,我们排除了其他所有的因素,如数据预处理方式、优化器设置。我们仅仅将DenseNet-BC网络替代ResNet模型,而保留ResNet的其他实验参数不变。
我们记录了DenseNets在ImageNet上single-crop和10-crop的验证误差,如表3所示。
DenseNets和ResNets single-crop的top-1验证误差如图3所示,其中左图以参数量为变量,右图以flops为变量。
如图3所示,与ResNets相比,在相同性能的前提下DenseNets参数量和计算量更小。例如,拥有20M参数的DenseNet-201的误差率和拥有超过40M参数的101-ResNet误差率相近。从图3的右图也可以看到类似的结果:和ResNet-50计算量接近的DenseNet大约是ResNet-101计算量的两倍。
值得注意的是,我们是修改和ResNets对应的超参数而不是DenseNets的。我们相信还可以通过修改更多的超参数来优化DenseNet在ImageNet上的性能。
5. 讨论
从表面来看,DenseNets和ResNets很像:方程(2)和方程(1)的不同主要在输入 (进行拼接而不是求和)。然而,这个小的改变却给这两种网络结构的性能带来了很大的差异。
模型简化性(compactness)。将输入进行连接的直接结果是,DenseNets每一层学到的特征图都可以被以后的任一层利用。该方式有助于网络特征的重复利用,也因此得到了更简化的模型。
图4左边的两张图展示了实验的结果,左图比较了所有DenseNets的参数效率,中图对DenseNts和ResNets的参数效率进行了比较。我们在C10+数据上训练了不同深度的多个小模型,并绘制出准确率。和一些流行的网络(如AlwxNet、VGG)相比,pre-activation的ResNets的准确率明显高于其他网络。之后,我们将DenseNet( )与该网络进行了比较。DenseNet的训练集同上节。
如图4,DenseNet-BC是参数效率最高的一个DenseNet版本。此外,DenseNet-BC仅仅用了大概ResNets 1/3的参数量就获得了相近的准确率(中图)。该结果与图3的结果相一致。如图4右图,仅有0.8M参数量的DenseNet-BC和有10.2M参数的101-ResNet准确率相近。
隐含的深度监督(implicit deep supervision)。稠密卷积网络可以提升准确率的一个解释是,由于更短的连接,每一层都可以从损失函数中获得监督信息。可以将DenseNets理解为一种“深度监督”(deep supervision)。深度监督的好处已经在之前的深度监督网络(DSN)中说明,该网络在每一隐含层都加了分类器,迫使中间层也学习判断特征(discriminative features)。
DensNets和深度监督网络相似:网络最后的分类器通过最多两个或三个过渡层为所有层都提供监督信息。然而,DenseNets的损失函数值和梯度不是很复杂,这是因为所有层之间共享了损失函数。
随机vs确定连接。稠密卷积网络与残差网络的随机深度正则化(stochastic depth
regularzation)之间有着有趣的关系。在随机深度中,残差网络随机丢掉一些层,直接将周围的层进行连接。因为池化层没有丢掉,所以该网络和DenseNet有着相似的连接模式:以一定的小概率对相同池化层之间的任意两层进行直接连接——如果中间层随机丢掉的话。尽管这两个方法在根本上是完全不一样的,但是DenseNet关于随机深度的解释会给该正则化的成功提供依据。
特征重复利用。根据设计来看,DenseNets允许每一层获得之前所有层(尽管一些是通过过渡层)的特征图。我们做了一个实验来判断是否训练的网络可以重复利用这个机会。我们首先在C10+数据上训练了 的DenseNet。对于每个block的每个卷积层 ,我们计算其与 层连接的平均权重。三个dense block的热度图如图5所示。
平均权重表示卷积层与它之前层的依赖关系。位置 处的一个红点表示层 充分利用了前 层产生的特征图。由图可以得出以下结论:
- 在同一个block中,所有层都将它的权重传递给其他层作为输入。这表明早期层提取的特征可以被同一个dense block下深层所利用;
- 过渡层的权重也可以传递给之前dense block的所有层,也就是说DenseNet的信息可以以很少的间接方式从第一层流向最后一层;
- 第二个和第三个dense block内的所有层分配最少的权重给过渡层的输出,表明过渡层输出很多冗余特征。这和DenseNet-BC强大的结果有关系;
- 尽管最后的分类器也使用通过整个dense block的权重,但似乎更关注最后的特征图,表明网络的最后也会产生一些高层次的特征。
6. 结论
我们提出了一个新的卷积网络结构,称之为稠密卷积网络(DenseNet)。它将两个相同特征图尺寸的任意层进行连接。这样我们就可以很自然的设计上百层的网络,还不会出现优化困难的问题。在我们的实验中,随着参数量的增加,DenseNets的准确率也随之提高,而且也没有出现较差表现或过拟合的现象。通过超参数的调整,该结构在很多比赛的数据上都获得了不错的结果。此外,DenseNets有更少的参数和计算量。因为我们只是在实验中调整了对于残差网络的超参数,所以我们相信通过调整更多的超参数和学习率,DenseNets的准确率还会有更大的提升。
遵循这个简单的连接规则,DenseNets可以很自然的将自身映射(identity mappings)、深度监督(deep supervision)和深度多样化(diversified depth)结合在一起。根据我们的实验来看,该结构通过对网络特征的重复利用,可以学习到更简单、准确率更高的模型。由于简化了内部表征和降低了特征冗余,DenseNets可能是目前计算机视觉领域中在卷积网络方面非常不错的特征提取器。在以后的工作中我们计划研究DenseNets下的特征迁移工作。
后记: