DenseNet论文笔记

    论文:Gao Huang, Zhuang Liu, Laurens van der Maaten, Kilian Q. Weinberger.Densely Connected Convolutional Networks.CVPR 2017


摘要

    最近的研究表明,如果CNNs在靠近输入层和接近输出层之间使用较短的连接,那么可以更深入、更准确、更有效地进行训练网络。由此,本文提出了稠密卷积网络(DenseNet),以前馈的方式各层相互连接。传统的L层CNNs有L个连接,每层与它前一层和后一层相连;而L层的DenseNet有L(L+1)/2个连接,每层以前面所有层作为输入,而且是后面所有层的输入。DenseNet有几个优点:缓解了梯度消失问题,增加了特征传播,鼓励特征重用,极大减小了特征参数。本文在CIFAR-10、CIFAr-100、SVHN、ImageNet上评估DenseNet相比与ResNet都有很大的提高。

    代码开源:https://github.com/liuzhuang13/DenseNet. 


引言

    CNNs是CV领域主流的机器学习方法。尽管CNNs已经出现了二十多年,但是直到最近几年才流行起来。最早的CNNs——LeNet5有5层,2014年的VGG达到了19层,而ResNet超过了100层。随着网络的加深,当输入或梯度信息在经过很多层的传递之后,在到达网络的最后(或开始)可能会消失或者“被冲刷掉”(wash out)。最近,ResNet和Highway Networks通过恒等连接将信号传到下一层,Stochastic depth通过在训练过程中随机丢弃层来缩短ResNet以达到更好的信息和梯度流动。FractalNet在保持网络中多条短路径的同时,通过反复组合多个具有不同卷积块数的并行层序列来获得较大的深度。这些方法都有一个共同点:从前面的层创建一个短路径到后面的层。

    为了确保网络中各层之间最大的信息流动,本文将每层与其它层相连:根据前向传播,每层以前面所有层作为输入,该层是后面所有层的输如,如下图所示:

图片1.jpg

    ResNet将残差和直通通路进行相加,而本文是各个层的输入按通道拼接(Concatenate)成为单个特征图。第l层由l个输入,第l层的特征图将被输入到后面的L-l层中。因此,一个L层的网络中共有L(L+1)/2个连接。因为这些连接非常密集,因此称这种方法为稠密卷积网络(DenseNet)。

    这种稠密连接模型需要更少的参数,因为不需要学习多余的特征图。传统的前馈结构CNNs可以看作是一种具有状态的算法,这种状态逐层传递。每层从前一层接收状态并写入下一层,该层改变了状态,但也传递了需要保留的信息。ResNet通过恒等映射使这种信息保存更加明确。ResNet-v2表明许多层的贡献很小,可以在训练期间随机丢弃,使得ResNets的状态类似于(展开的)RNN,但是ResNets的参数数量要多得多,因为每个层都有自己的权重。

    本文提出的DenseNet架构明确区分了添加到网络中的信息和保留的信息。DenseNet的层非常狭窄,每层只有12个滤波器,仅仅增加小数量的特征图到网络的“集体知识”(collective knowledge),并且保持这些特征图不变——最后的分类器基于网络中的所有特征图进行预测。

    除了更好的利用参数之外,DenseNet提高了网络中信息和梯度的流动,使得网络更容易训练。每一层都可以直接从损失函数获得梯度,从输入中获得信息,实现了隐式深度监督,有助于训练更深的网络。此外,本文发现稠密连接有正则化的效果,有利于模型的泛化。

    本文在四个数据集:CIFAR-10、CIFAR-100、SVHN、ImageNet上评估DenseNets,在这些数据集上都取得了很好的结果。


DenseNets

    假设单张图片x_0传入CNNs,网络包含L层,每层可表示为非线性变换Hl(*),l是层的索引。Hl(*)实际上可能包含BN、ReLU、Pooling、Conv等。第l层的输出记为x_l。

    ResNets:传统的CNNs的第l层的输出是第l+1层的输入,即xl=Hl(x_l-1)。ResNets增加了一个恒等旁路,则可以记为:xl=Hl(x_l-1)+x_l-1。ResNet的一个优点是梯度可以通过恒等通路流动到前面的层。但是恒等通路和Hl的输出是相加的,这可能会妨碍网络中的信息流。

    稠密连接:为了提高层间的信息流,本文提出了稠密连接的方式,如图1所示。因此,第l层接收前面所有层的特征图作为输入:x_l=Hl([x_0,x_1,...,x_l-1])。其中[x_0,x_1,...,x_l-1]表示前面0到l-1层特征图的concatenation。

    组合函数:本文定义Hl(*)为多个操作的组合,首先是3x3卷积和ReLU,后接BN。

    池化层:稠密连接的时候无法进行下采样,因此整个CNNs划分为多个dense blocks,如下图所示:

图片2.jpg

    block之间称为过渡层(transition layers),进行卷积和池化操作,使用BN和1x1卷积后接2x2平均池化。

    增长率:Hl生成k个通道的特征图,输入特征图的通道数为k0+k*(l-1),k0是输入层的特征图通道数。DenseNet非常的狭窄,比如k=12。把超参数k称为网络的增长率(growth rate)。后面的实验表明小的growth rate足以获得SOTA结果。一种解释是由于每一层都可以和它所在的block中之前的所有特征图进行连接,使得网络具有了“集体知识”(collective knowledge)。另一种解释是将特征图看作是网络的全局状态。每一层相当于是对当前状态增加 [公式] 个特征图。增长速率控制着每一层有多少信息对全局状态有效。全局状态一旦被写定,就可以在网络中的任何地方被调用,而不用像传统的网络结构那样层与层之间的不断重复。

    Bottleneck层:虽然每层仅输出k通道的特征,但是有很多层作为输入,因此每层的输入通道很多。因此可以在3x3卷积前面引入1x1卷积作为bottleneck层,以减少输入通道,从而提高计算效率。带bottleneck的网络每层为BN-ReLU-1x1Conv-BN-ReLU-3x3Conv,整个网络称为DenseNet-B。其中1x1卷积输出4k个通道。

    压缩:为了提高模型的紧凑性,可以减少transition层的通道数。若dense block包含m个特征图,令后接的transition层输出floor(θm)个通道,其中0<θ<1。将θ称为压缩系数。当θ=1时,不改变transition层的通道数。当θ<1时,称网络为DenseNet-C,实验中设置θ=0.5。当同时应用Bottleneck和θ<1时,称网络为DenseNet-BC。

    实现细节:在除了ImageNet的所有数据集上,DenseNet设置3个block,每个block的层数相同。在第一个block的前面,放置一个卷积层。block里面使用3x3卷积,zero-padded。两个block之间使用1x1卷积后接2x2平均池化作为transition layers。在最后一个block的后面接GAP层。三个block的特征图大小分别是32x32、16x16、8x8。实验中对于基础的DenseNet使用三种配置:{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个block,输入分辨率为224x224。详细的配置如下表:

图片3.jpg


实验

    将DenseNet在CIFAR-10(C10)、CIFAR-100(C100)、数据增强后的CIFAR-10(C10+)、数据增强后的CIFAR-100(C100+)、SVHN、ImageNet等数据集上进行评估。

    训练配置:所有的网络使用SGD训练。在CIFAR和SVHN数据集上使用batch size=64,分别训练300和40轮,初始学习率为0.1,在50%和75%轮时学习率除以10。在ImageNet上使用batch size=256,训练90轮,初始学习率为0.1,在30轮和60轮时学习率除以10。直接实现DenseNet内存效率不高,训练时可能显存不足,可参考作者的实现[ Memory-efficient implementation of densenets, arXiv:1707.06990]。

    使用权重衰减系数为10^-4,Nesterov动量系数为0.9。对于没有数据增强的数据集:C10 C100 SVHN,除了第一个卷积外其它卷积后增加0.2 Dropout层。    

    在CIFAR和SVHN的结果

    下面是DenseNet与ResNet在CIFAR和SVHN数据集上的评估结果。

图片4.jpg

    从上表可以看到,DenseNet在各个数据集上的精度都胜过了ResNet的各个版本。在没有压缩和bottleneck层的时候,DenseNet的性能随着L和k的增加而提高,这种提高由模型容量增加而带来的。这表明DenseNet可以充分利用更大、更深模型的表示能力,以及不会遇到ResNet中遇到的过拟合和优化困难问题。

    从上表可以看到,DenseNet比ResNet更能充分利用参数。比如DenseNet-BC-250有15.3M参数,而其它对应模型比如Wide ResNets超过38.6M参数量。此外,DenseNet更不容易过拟合。

    在ImageNet上的结果

    下面是DenseNet-BC在ImageNet数据集上的测试结果,单裁剪/10裁剪测试:

图片5.jpg

    下图展示了DenseNet和ResNet在ImageNet上的对比,左图是参数量/top-1精度,右图是FLOPs/top-1精度。

图片6.jpg

    可以看到DenseNet在达到ResNet相同精度的情况下,所需的参数量和计算量少的多。


讨论

    模型压缩:DenseNet每层将输入的所有特征图进行Concatenation,因此该层学习到的特征图可被后面所有层访问。这可以有利于网络中特征重用,以及使得模型更加紧凑。

    下面左边的两个图展示了DenseNet和ResNet的参数效率对比,可以看到在达到相同精度的情况下,DenseNet仅需ResNet的1/3参数。下图的右图展示了DenseNet-BC在仅0.8M参数的情况下达到了ResNet-1001 10.2M的精度。

图片7.jpg

    隐形深层监督:DenseNet提高精度的另一个解释是各层通过较短的通路从损失函数接收额外的监督,称之为“深度监督”。深度监督的优势在DSN显示出来了,它在每个隐藏层上附加了分类器,强制中间层学习区分特征(discriminative features)。DenseNet以隐式地方式执行深度监督:网络顶部的单个分类器通过最多两到三个过渡层向所有层提供直接监督。然而,由于所有层之间共享相同的损失函数,DenseNet的损耗函数和梯度基本上不那么复杂。

    随机和确定性连接:DenseNet和随机深度正则化残差网络有一些关系。在随机深度正则化残差网络中,网络中的层被随机丢弃,这样可以将周围的层直接连接。由于池化层不被丢弃,因此网络会产生与DenseNet相似的连接模式:如果所有中间层都被随机丢弃,那么相同池化层之间的任何两个层直接连接的可能性很小。

    特征重用:DenseNet允许某层访问前面所有层,以及被后面所有层访问(在block内)。这里进行实验测试这点,在C10+数据集上训练L=40,k=12的DenseNet。对于在bloc内的层l,计算分配给层s的连接的平均绝对权重,如下图所示:

图片8.jpg

    平均绝对权重作为卷积层对其前面层的依赖性的替代项。位置(l,s)上的一个红点表示,平均而言,l层充分利用了s层之前生成的特征地图。从图中得到的结论如下:

    1.在同一个block中,所有层都将它的权重传递给其他层作为输入。这表明早期层提取的特征可以被同一个dense block下深层所利用;

    2.过渡层的权重也可以传递给之前dense block的所有层,也就是说DenseNet的信息可以以很少的间接方式从第一层流向最后一层;

    3.第二个和第三个dense block内的所有层分配最少的权重给过渡层的输出,表明过渡层输出很多冗余特征。这和DenseNet-BC强大的结果有关系;

    4.尽管最后的分类器也使用通过整个dense block的权重,但似乎更关注最后的特征图,表明网络的最后也会产生一些高层次的特征。




下一篇: 没有了

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于