写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我
热爱AI、热爱分享、热爱开源
! 这博客是我对学习的一点总结与思考。如果您也对深度学习、机器视觉、算法、Python、C++
感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
我的Github项目地址是:【AI 菌】的Github
资源传送门:
论文原文下载地址:《Densely Connected Convolutional Networks》
ResNet论文详解:《Deep Residual Learning for Image Recognition》
原项目地址:https://github.com/liuzhuang13/DenseNet
温馨提示
:DenseNet的实战手把手教程也将马上更新,想学习的盆友,可以关注我的博客动态。
文章目录
- 1. 论文摘要
- 2. 相关介绍
- 3. 相关研究
- 4. DenseNet网络结构
- (1) 稠密连接
- (2) 复合函数
- (3) 池化层
- (4) 增长率
- (5) 瓶颈层
- (6) 压缩
- (7) 实验细节
- 5. 实验
- (1) 数据集
- (2) 训练
- (3) CIFAR and SVHN上的分类结果
- (4) ImageNet上的分类结果
- 6. 总结
1. 论文摘要
最近的工作表明,如果卷积网络在靠近输入的层和靠近输出的层之间包含较短的连接,则可以进行更深入,更准确和有效的训练。 在本文中,我们注意到了这一观察,并介绍了稠密卷积网络(DenseNet),该网络以前馈方式将每一层连接到其他每一层。一般而言,具有L层的传统卷积网络具有L个连接(每一层与其后一层之间一个连接),而我们的网络具有 L ( L + 1 ) / 2 L(L + 1)/ 2 L(L+1)/2 个直接连接。对于每一层,所有先前层的特征图都用作输入,而其自身的特征图则用作所有后续层的输入。DenseNet具有几个引人注目的优点:它减轻了消失梯度的问题,增强了特征传播,鼓励了特征重用,并大大减少了参数数量。我们在四个竞争激烈的目标检测任务(CIFAR-10,CIFAR-100,SVHN和ImageNet)上评估了我们提出的体系结构。 DenseNets在大多数方面都比最新技术有了显著地改进,同时需要较少的计算即可实现高性能。
2. 相关介绍
随着CNN越来越深入,出现了一个新的研究问题:随着输入和梯度的信息传递过许多层,当到达网络的末尾(或起点)时,它可能消失并“消磨殆尽”。 最近的许多论文都在解决这个或相关问题。 ResNets和Highway Networks通过恒等连接(identify connection)将信号从一层旁路到另一层。 随机深度(Stochastic depth)通过在训练过程中随机放置各层来缩短ResNets,以提供更好的信息和梯度流。 FractalNets 反复将几个并行层序列与不同数量的卷积块组合在一起,以获得较大的 nominal depth,同时保持网络中的许多短路径。尽管这些不同的方法在网络拓扑和训练过程方面有所不同,但是它们都具有一个关键特征:它们创建了从低层到高层的短路径‘。
在本文中,提出了一种结构,该结构将这种见解提炼为简单的连接模式:为了确保网络中各层之间的最大信息流,我们将所有层(具有匹配的特征图大小)直接相互连接。为了保留前馈特性,每层都从所有先前的层中获取其他输入,并将其自身的特征图传递给所有后续层。图1说明了这种布局。至关重要的是,与ResNets相比,我们永远不会通过求和来组合特征。相反,我们通过concatenating组合它们。因此,第 l l l层具有 l l l个输入,由所有前面的卷积块的特征图组成。它自己的特征图将传递到所有 L − l L-l L−l个随后的层。这将在 L L L层网络中引入 L ( L + 1 ) / 2 L(L + 1)/2 L(L+1)/2个连接,而不是像传统体系结构那样仅有 L L L个连接。由于其稠密的连接模式,我们将这种方法称为稠密卷积网络(DenseNet)。
注意:ResNet的连接方式是,将通道数相同的 F ( x ) F(x) F(x)与恒等映射x identify连接,即对应通道上的像素值进行相加。详见:TF2.0深度学习实战(七):手撕深度残差网络ResNet
DenseNet的连接方式是,将size相同的feature maps直接在通道维度上进行堆叠。
这种稠密的连接模式的可能与直觉相反的效果是,与传统的卷积网络相比,它需要的参数更少,因为不需要重新学习冗余的特征图。可以将传统的前馈体系结构视为具有状态的算法,该状态会逐层传递。每一层都从其上一层读取状态,然后写入下一层。它不仅可以更改状态,还可以传递需要保留的信息。 ResNets 通过附加 identity transformations 使这种信息保存变得明确。ResNets的最新变体表明,许多层的贡献很小,实际上在训练过程中可以随机丢弃。这使得ResNet的状态类似于(展开的)循环神经网络(recurrent neural networks),但是ResNet的参数数量明显更大,因为每一层都有其自己的权重。我们提出的DenseNet体系结构明确区分了添加到网络的信息和保留的信息。DenseNet层非常狭窄(例如,每层12个卷积核),仅向网络的“collective knowledge”添加少量特征图,并保持其余特征图不变——最终分类器基于所有特征做出决策。
除了更好的参数效率外,DenseNets的一大优势是它们在整个网络中改善了信息流和梯度,这使得它们易于训练。 每层都可以直接从损失函数和原始输入信号访问梯度,从而导致隐式的深度监督。这有助于训练更深层次的网络体系结构。此外,我们还观察到稠密连接具有正则化效果,从而减少了训练集较小的任务的过度拟合。
我们在四个竞争激烈的基准数据集(CIFAR-10,CIFAR-100,SVHN和ImageNet)上评估DenseNet。与现有算法相比,达到差不多的精确度,我们的模型所需参数量往往要低得多。此外,在大多数基准测试任务上,我们的性能明显优于当前最新水平的结果。
3. 相关研究
使网络更深的正交方法是增加网络宽度,例如借助跳跃连接。GoogLeNet 使用“Inception模块”,它将不同大小的卷积核生成的特征图连接起来。 在《Resnet in resnet Generalizing residual architectures》中,提出了具有广泛广义残差块的ResNets的变体。 实际上,只要深度足够,只需增加ResNets每层中的卷积核数量就可以改善其性能。FractalNets还使用宽的网络结构在多个数据集上取得了具有竞争性的结果。
DenseNets并未从极深或极宽的结构中获得代表性的功能,而是通过特征重用来挖掘网络的潜力,从而产生易于训练且参数高效的浓缩模型。连接不同层学习到的特征图会增加后续层输入的变化并提高效率。这构成了DenseNet和ResNet之间的主要区别。相较于Inception网络结构,它也将不同层次的特征连接起来,DenseNets更简单,更高效。
还有其他重要的网络体系结构创新也产生了具有竞争性的结果。The Network in Network (NIN)结构将微多层感知器包含到卷积层的卷积核中,以提取更复杂的特征。在深度监督网络(DSN)中,内部层由辅助分类器直接监督,这可以加强浅层接收到的梯度。Ladder Networks将横向连接引入自动编码器,从而在半监督学习任务上产生了令人印象深刻的准确性。在《Deeply-fused nets》中,提出了深度融合网络(DFN)来通过组合不同基础网络的中间层来改善信息流。用最小化重建损失的途径增强网络也可以改善图像分类模型。
4. DenseNet网络结构
DenseNet本质上还是一个卷积神经网络。该网络包含L个层,每层都会执行一个非线性变换 H l H_l Hl,其中 l l l是该层的索引。 H l H_l Hl可以是BN层、ReLU激活函数和池化或者卷积层的复合函数。我们定义输入的图像是 x 0 x_0 x0,第 l l l层的输出是 x l x_l xl。
(1) 稠密连接
传统的卷积神经网络:将第 l l l层的输出作为第 l + 1 l+1 l+1层的输入,用公式可表示为: x l = H ( x l − 1 ) x_l=H(x_{l-1}) xl=H(xl−1)
深度残差网络ResNet:ResNets添加了一个捷径连接,该连接使用恒等映射绕过了非线性变换 H l H_l Hl。用公式可表示为: x l = H ( x l − 1 ) + x l − 1 x_l=H(x_{l-1})+x_{l-1} xl=H(xl−1)+xl−1
稠密卷积网络DenseNet:为了进一步改善各层之间的信息流,提出了一种不同的连接模式——稠密连接:引入了从任何层到所有后续层的直接连接。 图1示说明了DenseNet的布局,第 l l l层接收所有先前的层 x 0 , x 1 , . . . , x l − 1 x_0, x_1,..., x_{l-1} x0,x1,...,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]表示将 x 0 , x 1 , . . . , x l − 1 x_0, x_1,..., x_{l-1} x0,x1,...,xl−1的特征图在通道维度上进行堆叠。
(2) 复合函数
受《 Identity mappings in deep residual networks》启发,我们将 H l H_l Hl定义为三个连续操作的复合函数:批量归一化(BN),然后是ReLU激活函数和3×3卷积(转换)。
(3) 池化层
如图2所示,上面的每一个稠密块(DenseNet Block)
都采用稠密连接的方式。这些稠密块之间的层称为过渡层(transition layer)
,进行卷积和池化。
下采样层是卷积神经网络的重要组成部分,这些层可以更改特征图的大小。在周密块中进行下采样是不可行的,因此此实验是在过渡层进行下采样。过渡层包括:批量归一化BN、1×1卷积层,然后是2×2平均池化层。
(4) 增长率
如果每个函数 H l H_l Hl 产生k个特征图,则得出第 l l l层具有 k 0 + k × ( l − 1 ) k_0 + k×(l-1) k0+k×(l−1)个输入特征图,其中 k 0 k_0 k0是输入层中的通道数。DenseNet与现有网络架构之间的一个重要区别是DenseNet可以具有非常狭窄的层,例如k =12。我们将超参数k称为网络的增长率。我们在第4节中表明,相对较小的增长率足以在我们测试的数据集上获得最先进的结果。 对此的一种解释是,每个层都可以访问其块中的所有前面的特征图,因此可以访问网络的“集体知识”。可以将特征图视为网络的全局状态。每层将自己的k个特征图添加到此状态。增长率调节每一层为全局状态贡献多少新信息。写入后的全局状态可以在网络中的任何位置进行访问,并且与传统的网络体系结构不同,无需逐层复制它。
(5) 瓶颈层
尽管每个图层仅产生k个输出特征图,但通常会有更多的输入。 在《Rethinking the inception architecture for computer vision》中已经指出,可以在每个3×3卷积之前引入1×1卷积作为瓶颈层,以减少输入特征图的数量,从而提高计算效率。 我们发现此设计对DenseNet特别有效,我们将具有这种瓶颈的网络(即 H l H_l Hl的BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3)版本)称为DenseNet-B。 在我们的实验中,我们让每个1×1卷积产生4k个特征图。
(6) 压缩
为了进一步提高模型的紧凑性,我们可以减少过渡层的特征图数量。如果一个周密块包含m个特征图,则让以下过渡层生成θm个输出特征图,其中0 <θ≤1称为压缩因子。 当θ= 1时,跨过渡层的特征图数量保持不变。 我们将θ<1的DenseNet称为DenseNet-C,并在实验中将θ= 0.5。当同时使用θ<1的瓶颈和过渡层时,我们将模型称为DenseNet-BC。
(7) 实验细节
在除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。 表1显示了我们在ImageNet上使用的确切网络配置。
5. 实验
(1) 数据集
CIFAR:两个数据集CIFAR-10和CIFAR-100,均由32×32像素的彩色自然图像组成。 CIFAR-10(C10)包含10个类别的图像,CIFAR-100(C100)包含100个类别的图像。 训练集和测试集分别包含50,000张和10,000张图像,我们保留5,000张训练图像作为验证集。 我们采用了标准的数据增强方案(镜像/移位),该方案广泛用于这两个数据集。我们在数据集名称(例如C10 +)的末尾用“ +”号表示此数据增强方案。对于预处理,我们使用通道平均值和标准偏差对数据进行归一化。对于最终运行,我们使用所有50,000张训练图像,并在训练结束时报告最终测试错误。
SVHN:街景门牌号码(SVHN)数据集包含32×32彩色数字图像。训练集中有73257张图像,测试集中有26032张图像,而其他训练有531131张图像。 按照常规做法,我们使用所有训练数据而没有做任何数据增强,并从训练集中分配出6,000张图像的验证集。我们选择训练期间验证误差最小的模型,并报告测试误差。 我们遵循《 Wide residual networks》并将像素值除以255,因此它们在[0,1]范围内。
ImageNet:ILSVRC 2012分类数据集包含来自1,000个类别的120万张用于训练的图像和50,000张用于验证的图像。 我们采用与《Training and investigating residual
nets》中相同的数据增强方案来训练图像,并在测试时应用大小为224×224的single-crop或10-crop。按照《 Deep residual learning for image recognition》中的方式,我们报告了验证集上的分类错误。
(2) 训练
所有网络均使用随机梯度下降(SGD)进行训练。在CIFAR和SVHN上,我们分别设置batch_size=64进行训练300和40个epochs。初始学习率设置为0.1,然后在训练时期总数的50%和75%阶段,除以10。在ImageNet上,我们训练了90个epochs的模型,批量大小为256。最初将学习速率设置为0.1,然后在第30和60个epochs的阶段将其降低10倍。请注意,DenseNet的简单实施可能会导致内存效率低下。为了减少GPU上的内存消耗,请参考我们有关DenseNets的内存高效实现的技术报告《Memory-efficient implementation of densenets》。
根据《Training and investigating residual nets》,我们使用 1 0 − 4 10^{-4} 10−4的权重衰减和0.9的Nesterov动量而不进行阻尼。我们采用《 Delving deep into rectifiers: Surpassing human-level performance on imagenet classification.》引入的权重初始化。对于没有数据增强的三个数据集,即C10,C100和SVHN,我们在每个卷积层(第一个卷积层除外)之后添加一个Dropout层,并将丢失率设置为0.2。对于每个任务和模型设置,仅对测试错误进行一次评估。
(3) CIFAR and SVHN上的分类结果
我们训练具有不同深度L和增长率k的DenseNet。 表2中显示了CIFAR和SVHN的主要结果。为了突出总体趋势,我们用粗体标记所有优于现有技术水平的结果,用蓝色标记总体最佳结果。
精确度Accuracy:最明显的趋势来自表2的最下面一行,该表表明L=190和k = 40的DenseNet-BC在所有CIFAR数据集上的性能始终优于现有的最新技术。它在C10 +上的错误率是3.46%,在C100 +上的错误率是17.18%,远低于Wide ResNet结构所实现的错误率。我们在C10和C100上获得的最佳结果(不进行数据增强)甚至更令人鼓舞:两者均比采用 drop-path正则化的FractalNet低近30%。 在SVHN上,具有Dropout的L = 100和k = 24的DenseNet也超过了Wide ResNet所获得的当前最佳结果。但是,250层DenseNet-BC不能比较短的DenseNet-BC进一步提高性能。可以通过SVHN相对容易的任务来解释这一点,并且极深的模型可能在训练集上产生过拟合。
容量:没有压缩层或瓶颈层,总的趋势是DenseNets随着L和k的增加而表现更好。 我们将此主要归因于模型容量的相应增长。C10 +和C100 +的实验结果栏对此进行了最好的说明。在C10 +上,随着参数数量从1.0M增加到7.0M到27.2M,误差从5.24%降至4.10%,最后降至3.74%。在C100 +上,我们观察到了类似的趋势。这表明DenseNets可以利用更大和更深层模型的增强表示能力。这也表明它们没有出现过度拟合或残差网络的优化困难问题。
参数有效性:表2中的结果表明,DenseNets比其他体系结构(尤其是ResNets)更有效地利用参数。具有瓶颈结构并在过渡层减小尺寸的DenseNet-BC特别具有参数效率。 例如,我们的250层模型仅具有15.3M参数,但是始终优于其他模型,比如FractalNet和Wide ResNets的参数超过30M。 我们还着重指出,L = 100和k = 12的DenseNet-BC与ResNet-1001性能差不多(例如,C10 +的误差为4.51%vs 4.62%,C100 +的误差为22.27%vs 22.71%),但是使用的参数量比ResNet-1001减少了90%。 图4(下图)显示了C10 +上这两个网络的训练损失和测试错误。1001层深度的ResNet收敛到较低的训练损失值,但测试误差相似。 我们将在下面更详细地分析这种影响。
过拟合:更有效地使用参数的一个积极的作用是DenseNets不太容易过度拟合。我们观察到,在没有数据增强的数据集上,与以前的工作相比,DenseNet体系结构的改进特别明显。在C10上,改善表示相对误差降低了29%,从7.33%降低到5.19%。 在C100上,减少幅度约为30%,从28.20%降至19.64%。 在我们的实验中,我们观察到了由单一设置导致的潜在的过拟合现象:在C10上,通过将k = 12增加到k = 24而产生了4倍的参数增长,导致误差从5.77%到5.83%的适度增加。DenseNet-BC瓶颈和压缩层似乎是应对这一趋势的有效方法。
(4) ImageNet上的分类结果
我们对ImageNet分类任务以不同的深度和增长率评估DenseNet-BC,并将其与最新的ResNet架构进行比较。为了确保这两种结构之间的公平比较,我们依据《 Training and investigating residualnets》为ResNet采用了公开可用的Torch实现方法,消除了所有其他因素,例如数据预处理和优化设置的差异。我们仅用DenseNetBC网络替换ResNet模型,并使所有实验设置与用于ResNet的设置完全相同。
我们在表3中报告了ImageNet上DenseNets的single-crop和10-crop验证错误。图3(下图)显示了DenseNets和ResNets的single-crop top-1验证错误与参数数量(左)和FLOPs(右)的函数关系。结果表明,DenseNet可以与最先进的ResNet媲美,而所需的参数和计算量却要少得多,以实现可比的性能。例如,具有20M参数的DenseNet-201模型产生的验证错误与具有40M以上参数的101层ResNet产生类似的验证错误。从下图(右)可以看到类似的趋势,该图将验证误差绘制为FLOP数量的函数:DenseNet-201使用与ResNet-50等同的参数量能到达ResNet-101的性能,而ResNet-101需要的计算量是DenseNet-201的两倍。
值得注意的是,实验表明我们使用针对ResNets优化的超参数设置,不适用于DenseNets。可以想象,更广泛的超参数搜索可以进一步提高DenseNet在ImageNet上的性能。
6. 总结
我们提出了一种新的卷积网络体系结构,我们称之为稠密卷积网络(DenseNet)。它在任何两个具有相同特征图大小的网络层之间引入直接连接。 我们证明了DenseNets可以自然扩展到数百个层,而没有任何优化困难。在我们的实验中,DenseNets倾向于随着参数数量的增加而不断提高精度,而没有任何性能下降或过度拟合的迹象。在多种设置下,它在多个竞争激烈的数据集上均取得了最先进的结果。此外,DenseNets只需要更少的参数和更少的计算量就能实现最好的性能。由于我们在研究中采用了针对残差网络优化的超参数设置,因此我们相信,通过更详细地调整超参数和学习率,可以进一步提高DenseNets的准确性。
遵循简单的连接规则,DenseNets自然地集成了恒等映射(identity mappings),深度监控(deep supervision)和多样化深度(diversified depth)的属性。它们允许在整个网络中重用特征,从而可以学习更紧凑的模型,并根据我们的实验获得更准确的模型。由于其紧凑的内部表示形式和减少的特征冗余,DenseNets可能是良好的特征提取器,可用于基于卷积特征的各种计算机视觉任务。我们计划在将来的工作中使用DenseNets研究这种特征转移(feature transfer)。