DenseNetDensely Connected Convolutional Networks (2018) 全文翻译
Posted 魏晓蕾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DenseNetDensely Connected Convolutional Networks (2018) 全文翻译相关的知识,希望对你有一定的参考价值。
作者
Gao Huang∗(Cornell University,gh349@cornell.edu)
Zhuang Liu∗(Tsinghua University,liuzhuang13@mails.tsinghua.edu.cn)
Laurens van der Maaten(Facebook AI Research,lvdmaaten@fb.com)
Kilian Q. Weinberger(Cornell University,kqw4@cornell.edu)
摘要
最近的研究表明,如果卷积网络在靠近输入层和接近输出层的层之间包含较短的连接,那么卷积网络可以更深入、更准确、更有效地进行训练。在本文中,我们接受了这一观察结果,并引入了密集卷积网络(DenseNet),它以前馈方式将每一层连接到另一层。传统的L层卷积网络在每层及其后续层之间有L个连接,我们的网络有 L ( L + 1 ) 2 \\fracL(L+1)2 2L(L+1)个直接连接。对于每一层,所有前一层的特征映射被用作输入,其自身的特征映射被用作所有后续层的输入。densenet有几个共同的优点:它们缓解了消失梯度问题,加强了特征传播,鼓励了特征重用,并大大减少了参数的数量。我们在四个竞争激烈的对象识别基准任务(CIFAR-10、CIFAR-100、SVHN和ImageNet)上评估了我们提出的体系结构。DenseNets在大多数方面都比最先进的技术有了显著的改进,同时需要更少的计算来实现高性能。代码和预培训模型可在https://github.com/liuzhang13/DenseNet。
1. 引言
卷积神经网络(CNNs)已成为视觉对象识别的主流机器学习方法。尽管它们最初是在20多年前引入的[18],但计算机硬件和网络结构的改进使真正深入的CNN的培训成为可能。最初的LeNet5[19]由5层组成,VGG的特点是19[29],只有去年高速公路网[34]和残差网络(ResNets)[11]才超过了100层屏障。
随着CNN的日益深入,一个新的研究问题出现了:当关于输入或梯度的信息经过许多层时,当它到达网络的末端(或开始)时,它可能会消失并“消失”。许多最近的出版物都讨论了这个问题或相关问题。ResNets[11]和公路网[34]通过身份连接将信号从一层传递到下一层。随机深度[13]通过在训练过程中随机丢弃层来缩短resnet,以获得更好的信息和梯度流。分形网[17]反复地将多个具有不同卷积块数的平行层序列组合在一起,以获得较大的标称深度,同时保持网络中的许多短路径。虽然这些不同的方法在网络拓扑结构和训练过程上各不相同,但它们都有一个关键的特点:它们创建从早期层到后期层的短路径。
图1. 5层致密块体,生长速率k=4。每个图层都将前面所有的要素地图作为输入
在本文中,我们提出了一种架构,将这一观点提炼为一个简单的连接模式:为了确保网络中各层之间的信息流最大化,我们将所有层(具有匹配的特征映射大小)直接相互连接。为了保持前馈特性,每个层从所有前一层获取额外的输入,并将其自身的特征映射传递给所有后续层。图1示意性地说明了这个布局。关键的是,与resnet不同的是,我们从不在特征被传递到一个层之前通过求和来组合特性;相反,我们通过连接它们来组合特性。因此,第l层有l个输入,由所有先前卷积块的特征映射组成。它自己的特征映射被传递到所有L-L后续层。这在L层网络中引入了
L
(
L
+
1
)
2
\\fracL(L+1)2
2L(L+1)连接,而不是传统架构中的L。由于其密集连接模式,我们将其称为密集卷积网络(DenseNet)。
这种密集连接模式的一个可能与直觉相反的效果是,它比传统的卷积网络需要更少的参数,因为不需要重新学习冗余的特征映射。传统的前馈结构可以看作是一种具有状态的算法,这种状态是在一层又一层传递的。每一层从其前一层读取状态并写入下一层。它改变了状态,但也传递了需要保留的信息。ResNets[11]通过加性身份转换使这种信息保存变得明确。resnet的最新变体[13]表明,许多层的贡献很小,实际上可以在训练过程中随机丢弃。这使得ResNets的状态类似于(展开的)递归神经网络[21],但是ResNets的参数数量要大得多,因为每个层都有自己的权重。我们提出的DenseNet架构明确区分了添加到网络中的信息和保留的信息。DenseNet层非常窄(例如,每层12个过滤器),只在网络的“集合知识”中添加一小组特征映射,并保持其余特征映射不变,最终分类器根据网络中的所有特征映射做出决策。
除了更好的参数效率外,DenseNets的一大优势是其在整个网络中改进了信息流和梯度,这使得它们易于训练。每一层都可以直接访问损耗函数和原始输入信号的梯度,从而实现隐式深度监控[20]。这有助于对更深层次的网络体系结构进行培训。此外,我们还观察到稠密连接具有正则化效应,可以减少训练集规模较小的任务的过度拟合。
我们在四个极具竞争力的基准数据集(CIFAR-10、CIFAR-100、SVHN和ImageNet)上评估DenseNet。与现有算法相比,我们的模型需要的参数要少得多。此外,在大多数基准任务中,我们的性能明显优于当前最先进的结果。
2. 相关工作
自神经网络最初被发现以来,对网络结构的探索一直是神经网络研究的一部分。最近神经网络的重新流行也使这一研究领域重新活跃起来。现代网络中层数的增加扩大了体系结构之间的差异,并促使人们探索不同的连接模式和重新审视旧的研究思路。
类似于我们提出的密集网络布局的级联结构已经在20世纪80年代的神经网络文献中进行过研究[3]。他们的开创性工作集中在以一层一层的方式训练的完全连接的多层感知器。最近,提出了用批量梯度下降法训练的全连通级联网络[40]。虽然这种方法在小数据集上有效,但它只适用于具有几百个参数的网络。在文献[9,23,31,41]中,通过跳跃连接利用CNNs中的多层次特征对各种视觉任务是有效的。与我们的工作平行,[1]导出了一个与我们类似的具有跨层连接的网络的纯理论框架。
公路网[34]是最早提供了一种方法来有效训练100层以上端到端网络的体系结构之一。利用旁路路径和选通单元,可以毫不费力地优化具有数百层的公路网。旁路路径被认为是简化这些非常深的网络训练的关键因素。ResNets[11]进一步支持这一点,其中纯身份映射被用作绕过路径。ResNets在许多具有挑战性的图像识别、定位和检测任务(如ImageNet和COCO对象检测)上取得了令人印象深刻的、破纪录的性能[11]。最近,随机深度被认为是一种成功训练1202层ResNet的方法[13]。随机深度通过在训练过程中随机丢弃层来改进深度残差网络的训练。这表明并不是所有的层都需要,并强调了在深层(残余)网络中存在大量冗余。我们的论文部分地受到了这一观察结果的启发。具有预激活功能的ResNets也有助于对超过1000层的最新网络进行训练[12]。
使网络更深的一种正交方法(例如,借助于跳跃连接)是增加网络宽度。GoogLeNet[36,37]使用了一个“初始模块”,该模块将不同尺寸的过滤器生成的特征图串联起来。在[38]中,提出了一种广义残差块resnet的变体。事实上,只要在resnet的每一层中增加滤波器的数量,就可以提高其性能,只要深度足够[42]。在多个分形网络上[17]也获得了竞争性的网络结果。
DenseNets没有从极深或极广的体系结构中汲取表现力,而是通过特征重用来挖掘网络的潜力,产生易于训练且参数效率高的精简模型。将不同层学习到的特征映射连接起来,可以增加后续层的输入变化,并提高效率。这是DenseNets和Resnet之间的主要区别。与Inception networks[36,37]相比,DenseNet更简单,效率更高。
还有其他值得注意的网络架构创新也产生了竞争性的结果。Network-in-Network(NIN)[22]结构将微型多层感知器加入到卷积层的滤波器中,以提取更复杂的特征。在深度监督网络(DSN)[20]中,内部层由辅助分类器直接监督,这可以增强前一层接收到的梯度。梯形网络[27,25]将横向连接引入自动编码器,在半监督学习任务上产生令人印象深刻的精度。在文献[39]中,为了改善信息流,提出了深度融合网络(DFNs),它将不同基础网络的中间层结合起来。增加具有最小化重建损失的路径的网络也被证明可以改进图像分类模型[43]。
3. DenseNets
图2. 一个有三个致密块体的深火山岩。两个相邻块之间的层称为过渡层,通过卷积和池化改变特征图的大小
考虑通过卷积网络传递的单个图像
x
0
x_0
x0。该网络由
L
L
L层组成,每层实现非线性变换
H
l
(
⋅
)
H_l(·)
Hl(⋅),其中
l
l
l表示层。
H
l
(
⋅
)
H_l(·)
Hl(⋅)可以是操作的复合函数,例如批处理标准化(BN)[14]、校正线性单元(ReLU)[6]、池化[19]或卷积(Conv)。我们将第
l
l
l层的输出表示为
x
l
x_l
xl。
ResNets。 传统的卷积前馈网络将第l层的输出作为输入连接到第(l+1)层[16],这导致了以下层转换:
x
l
=
H
l
(
x
l
−
1
)
x_l=H_l(x_l-1)
xl=Hl(xl−1)。ResNets[11]添加了一个跳过连接,该连接通过标识函数绕过非线性转换:
x
l
=
H
l
(
x
l
−
1
)
+
x
l
−
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
1
)
x_l=H_l(x_l-1)+x_l-1.......................(1)
xl=Hl(xl−1)+xl−1.......................(1)
ResNets的一个优点是梯度可以直接通过恒等函数从后一层流到前一层。然而,身份函数和
H
l
H_l
Hl的输出是相加的,这可能会阻碍网络中的信息流。
紧密连接。 为了进一步改善层与层之间的信息流,我们提出了一种不同的连接模式:我们引入从任何层到所有后续层的直接连接。图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
]
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
(
2
)
x_l=H_l([x_0, x_1, ..., x_l-1]).....................(2)
xl=Hl([x0,x1,...,xl−1]).....................(2)
式中
[
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层中生成的特征图的串联。由于其密集的连通性,我们将这种网络结构称为密集卷积网络(DenseNet)。为了便于实现,我们将等式(2)中
H
l
(
⋅
)
H_l(·)
Hl(⋅)的多个输入连接成一个张量。
复合函数。 受[12]的启发,我们将
H
l
(
⋅
)
H_l(·)
Hl(⋅)定义为三个连续操作的复合函数:批处理规范化(BN)[14],然后是校正的线性单元(ReLU)[6]和3×3卷积(Conv)。
池化层。 当特征映射的大小发生变化时,式(2)中使用的连接操作是不可行的。然而,卷积网络的一个重要组成部分是向下采样层来改变特征映射的大小。为了便于在我们的架构中进行下采样,我们将网络划分为多个紧密连接的密集块;见图2。我们将块之间的层称为转换层,用于进行卷积和池化。在我们的实验中,一个1×2层的标准化层和一个卷积层2组成了一个卷积层。
增长率。 如果每个函数Hl生成k个特征映射,则第l层具有k0+k×(l-1)个输入特征映射,其中k0是输入层中的信道数。DenseNet与现有网络体系结构的一个重要区别是,DenseNet可以有非常窄的层,例如k=12。我们把超参数k称为网络的增长率。我们在第4节中说明,相对较小的增长率足以在我们测试的数据集上获得最新的结果。对此的一种解释是,每一层都可以访问其块中的所有前面的特征地图,因此,可以访问网络的“集体知识”。我们可以将特征图视为网络的全局状态。每个图层都将自己的k个要素地图添加到此状态。增长率控制着每一层为全球状态贡献了多少新信息。全局状态一旦写入,就可以从网络中的任何地方访问,而且与传统的网络体系结构不同,不需要在层到层之间复制它。
瓶颈层。 虽然每个层只产生k个输出特征映射,但它通常有更多的输入。文献[37,11]指出,可以在每3×3卷积之前引入1×1卷积作为瓶颈层,以减少输入特征映射的数量,从而提高计算效率。我们发现这种设计对DenseNet特别有效,我们将我们的网络称为具有这样一个瓶颈层的网络,即Hl的BN ReLU Conv(1×1)-BN ReLU Conv(3×3)版本,即DenseNet-B。在我们的实验中,我们让每个1×1卷积产生4k特征映射。
压缩。 为了进一步提高模型的紧凑性,我们可以减少过渡层特征映射的数量。如果一个稠密块包含m个特征映射,我们让下面的过渡层生成
θ
m
θ_m
θm输出特征映射,其中
0
<
θ
≤
1
0<θ≤1
0<θ≤1被称为压缩因子。当
θ
=
1
θ=1
θ=1时,跨过渡层的特征图数量保持不变。我们把
θ
<
1
θ<1
θ<1的DenseNet称为DenseNet-C,我们在实验中设置θ=0.5。当同时使用θ<1的瓶颈层和过渡层时,我们将我们的模型称为DenseNet-BC。
实现细节。 在除ImageNet之外的所有数据集中,我们实验中使用的DenseNet有三个密集的块,每个块都有相同数量的层。在进入第一个密集块之前,对输入图像执行16个(或两倍于DenseNet-BC的增长率)输出通道的卷积。对于核尺寸为3×3的卷积层,输入的每边被零填充一个像素,以保持特征映射的大小不变。我们使用1×1卷积和2×2平均池作为两个相邻密集块之间的过渡层。在最后一个稠密块的末尾,执行一个全局平均池,然后附加一个softmax分类器。三个稠密块的特征图尺寸分别为32×32、16×16和8×8。我们实验了具有L=40,k=12,L=100,k=12和L=100,k=24的基本DenseNet结构。对于DenseNet-BC,计算了L=100,k=12,L=250,k=24和L=190,k=40的网络。
在ImageNet上的实验中,我们在224×224幅输入图像上使用了一种具有4个密集块的DenseNet-BC结构。初始卷积层包括2k卷积,大小为7×7,步长为2;所有其他层中的特征映射数量也从设置k开始计算。我们在ImageNet上使用的确切网络配置如表1所示。
表1. ImageNet的DenseNet架构。所有网络的增长率为k=32。注意,表中显示的每个“conv”层对应于序列BN-ReLU-conv
4. 实验
我们用经验证明了DenseNet在几个基准数据集上的有效性,并与最先进的架构(尤其是ResNet及其变体)进行了比较。
表2. CIFAR和SVHN数据集的错误率(%)。k表示网络的增长率。超过所有竞争方法的结果都是大胆的,总的最佳结果是蓝色的。“+”表示标准数据扩充(转换和/或镜像)。*表示我们自己运行的结果。所有不增加数据的densenet(C10,C100,SVHN)的结果都是用Dropout得到的。densenet在使用比ResNet更少的参数的同时实现了更低的错误率。在没有数据扩充的情况下,DenseNet的性能大幅度提高
4.1 数据集
CIFAR。 两个CIFAR数据集[15]由32×32像素的彩色自然图像组成。CIFAR-10(C10)由10和100个级别的CIFAR-100(C100)图像组成。训练集和测试集分别包含50000和10000个图像,我们拿出5000个训练图像作为验证集。我们采用了一种标准的数据增强方案(镜像/移位),该方案广泛用于这两个数据集[11、13、17、22、28、20、32、34]。我们在数据集名称的末尾用“+”标记表示这个数据扩充方案(例如,C10+)。对于预处理,我们使用通道平均值和标准差对数据进行规范化。对于最后的运行,我们使用了所有50000个训练图像,并在训练结束时报告最终测试错误。
SVHN。 街景房号(SVHN)数据集[24]包含32×32个彩色数字图像。训练集中有73257幅图像,测试集中有26032幅图像,还有531131幅图像用于附加训练。按照惯例[7,13,20,22,30]我们使用所有的训练数据而不进行任何数据扩充,并且从训练集中分离出一个包含6000张图像的验证集。我们在训练过程中选择验证误差最小的模型并报告测试误差。我们遵循[42]并将像素值除以255,使其在[0,1]范围内。
ImageNet。 ILSVRC 2012分类数据集[2]包含120万张用于培训的图像,5万张用于验证的图像来自1000个班级。我们对训练图像采用与文献[8,11,12]相同的数据增强方案,在测试时应用单个作物或10个作物,大小为224×224。在[11,12,13]之后,我们报告验证集中的分类错误。
4.2 训练
所有的网络都是用随机梯度下降(SGD)训练的。在CIFAR和SVHN上,我们分别使用批大小64对300和40个时期进行训练。初始学习率设置为0.1,并除以10,分别占训练时段总数的50%和75%。在ImageNet上,我们训练90个时期的模型,批量大小为256个。学习率最初被设置为0.1,在第30和第60阶段降低10倍。请注意,DenseNet的幼稚实现可能包含内存效率低下的问题。为了减少gpu上的内存消耗,请参阅我们关于DenseNets内存效率实现的技术报告[26]。
在[8]之后,我们使用了10 4的权重衰减和0.9的Nesterov动量[35],但没有阻尼。我们采用了[10]引入的权重初始化。对于没有数据扩充的三个数据集,即C10、C100和SVHN,我们在每个卷积层(第一层除外)后面添加一个dropout层[33],并将dropout rate设置为0.2。每个任务和模型设置只评估一次测试错误。
4.3 CIFAR和SVHN上的分类结果
准确度。 最显著的趋势可能来自表2的最后一行,表2显示,在所有CIFAR数据集上,L=190和k=40的DenseNet BC的性能始终优于现有的最新技术。它在C10+上的错误率为3.46%,在C100+上的错误率为17.18%,明显低于由宽ResNet架构实现的错误率[42]。我们对C10和C100(无数据扩充)的最佳结果更令人鼓舞:两者都比具有下降路径正则化的分形网低近30%。在SVHN上,在退出的情况下,L=100和k=24的DenseNet也超过了wide ResNet目前的最佳结果。然而,250层的DenseNet-BC并没有比其较短的同类产品进一步提高性能。这可以解释为SVHN是一个相对容易的任务,并且极深的模型可能过于适合于训练集。
性能。 如果没有压缩层或瓶颈层,总的趋势是随着L和k的增加,densenet的性能会更好。我们将其主要归因于模型容量的相应增长。C10+和C100+的列最能说明这一点。在C10+上,随着参数数从1.0M增加到7.0M,误差从5.24%下降到4.10%,最后下降到3.74%。这表明,登森网络可以利用更大和更深入的模型所增加的代表力。这也表明它们不存在过拟合或残差网络优化困难[11]。
参数效率。 表2中的结果表明,densenet比其他架构(特别是resnet)更有效地利用参数。具有瓶颈结构和过渡层降维的DenseNet-BC参数效率特别高。例如,我们的250层模型只有15.3M的参数,但它始终优于其他模型,如FractalNet和Wide resnet,它们的参数超过30M。我们还强调,作为1001层预激活ResNet,L=100和k=12的DenseNet BC实现了可比的性能(例如,C10+上的4.51%对4.62%的误差,C100+的22.27%对22.71%的误差),作为1001层预激活重设网络,使用的参数减少了90%。图4(右面板)显示了这两个网络在C10+上的训练损失和测试错误。1001层深ResNet收敛到一个较低的训练损失值,但有一个类似的测试误差。下面我们将更详细地分析这种影响。
过拟合。 更有效地使用参数的一个积极的副作用是densenet不太容易过度拟合。我们观察到,在没有数据扩充的数据集上,DenseNet架构的改进比以前的工作尤其明显。在C10上,改进表明相对误差从7.33%减少到5.19%。在C100上,从28.20%到19.64%,减少了大约30%。在我们的实验中,我们观察到在单个设置下的潜在过拟合:在C10上,通过将k=12增加到k=24而产生的参数增加4倍,误差从5.77%适度增加到5.83%。DenseNet-BC瓶颈和压缩层似乎是应对这一趋势的有效方法。
4.4 ImageNet上的分类结果
我们评估了DenseNet-BC在ImageNet分类任务中的不同深度和增长率,并将其与最先进的ResNet架构进行了比较。为了确保两种架构之间的公平比较,我们采用了ResNet的公共可用Torch实现,消除了所有其他因素,如数据预处理和优化设置的差异[8](https://github.com/facebook/fb.resnet.torch)。我们只需将ResNet模型替换为DenseNet-BC网络,并保持所有实验设置与ResNet所用的完全相同。
我们在ImageNet上报告了DenseNets的单作物和10个作物验证错误,见表3。图3显示了DenseNets和resnet的top-1验证错误与参数(左)和FLOPs(右)数量的函数关系。图中所示的结果表明,densenet的性能与最先进的resnet不相上下,同时需要显著较少的参数和计算来实现可比性能。例如,具有20M参数的DenseNet-201模型产生的验证误差与参数超过40M的101层ResNet相似。从右面板可以观察到类似的趋势,该面板将验证错误描绘为flop数的函数:一个需要与ResNet-50一样多计算量的DenseNet与需要两倍计算量的ResNet-101不相上下。
值得注意的是,我们的实验设置意味着我们使用的超参数设置是为resnet而不是densenet优化的。可以想象,更广泛的超参数搜索可以进一步提高DenseNet在ImageNet上的性能。
5. 讨论
从表面上看,densenet与resnet非常相似:公式(2)与公式(1)的区别在于,
H
l
(
⋅
)
H_l(·)
Hl(⋅)的输入是串联的,而不是求和的。然而,这一看似微小的修改会导致这两种网络体系结构的行为发生本质上的不同。
模型紧凑性。 作为输入连接的直接结果,由任何DenseNet层学习的特征映射可以被所有后续层访问。这鼓励在整个网络中重用功能,并导致更紧凑的模型。
图4中左边的两个图显示了一个实验的结果,这个实验的目的是比较densenet的所有变体的参数效率(左)和一个可比较的ResNet架构(中间)。我们在C10+上训练多个不同深度的小网络,并将它们的测试精度绘制为网络参数的函数。与其他流行的网络架构(如AlexNet[16]或VGG net[29
以上是关于DenseNetDensely Connected Convolutional Networks (2018) 全文翻译的主要内容,如果未能解决你的问题,请参考以下文章
在游戏框架中,secure.connected() 是如何工作的?
Flutter Firebase Database child('.info/connected') 总是返回 true