DenseNet --CVPR 2017年 最佳论文

Posted 行路南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DenseNet --CVPR 2017年 最佳论文相关的知识,希望对你有一定的参考价值。

2017年国际计算机视觉与模式识别大会(CVPR2017)在美国夏威夷火奴鲁鲁岛召开,姚班计科30班刘壮同学以共同第一作者身份发表的大会论文Densely Connected Convolutional Networks(《密集连接的卷积神经网络》)获得了会议最佳论文奖。

论文主要的贡献是提出了一种全新的卷积神经网络架构DenseNet,显著地提升了模型在图片识别任务上的准确率。

让我们一起拜读一下大牛的这篇文章吧!!!

摘要

最近的研究工作表明,卷积神经网络在临近输入层和输出层之间加入捷径连接,使得网络能够更深、更准确、更有效地训练。

在本文中,我们提出了稠密卷积网络(DenseNet)。一个传统的L层卷积网络只有L个连接,是指每一层只与后一层相连;一个 L层的DenseNet网络有L(L+1)/2 个连接,是指每一层都与后继所有层相连接。

DenseNet 有以下优势:

  • 减缓梯度消失
  • 加强特征传递
  • 有效特征复用
  • 减少参数数量

DenseNet 在四个数据集(CIFAR-10, CIFAR-100, SVHN, ImageNet) 进行了评估,相比当前最好的模型来说取得了很大的提升,实现了更高的准确率的同时也减少了计算量。

一、引言

CNN卷积网络已经成为处理视觉目标识别问题的主流机器学习方法。尽管该方法已经在20年前已经提出,但在计算机硬件的升级换代和网络结构的提升之后,深度的CNN网络训练才成为可能。早期的LeNet-5只有5层,VGG网络有19层,HIghway和ResNet网络均超过了100层。

当卷积网络变得越来越深时,一个新的研究问题出现了: 随着输入信息或梯度信息穿越很多层网络后,它可能会消失。

近几年的研究分别针对这个问题给出了解决方案:

  1. ResNet和Highway网络采用了恒等连接的方式,使得输入直接从前面的层传递到后面的层。
  2. Stochastic depth 通过在训练阶段随机地丢弃一些层来实现信息和梯度得更好传递。(网络更深)
  3. FractalNets 使用不同数量的卷积块来组合若干个并行的层,并在网络中维护很多短的路径。(网络更宽)

尽管这些方法在网络拓扑和训练过程有所不同,但它们都有一个共同的特征:它们从早期的层到后期的层之间都创建了快捷路径。

在本文中,我们提出的网络结构,将上述的观察应用到一个简单的连接模式中,从而达到在网络层与层之间最大限度的信息流动的目的。
具体做法是:我们两两连接了网络中的所有层。每一层从它前面的所有层中获得了额外的输入,同时也将它自身输出的特征图传递到后续的所有层中。

与ResNet相比,DenseNet没有使用加和的方式去融合特征,而是选择了在通道层拼接的方式。

因此,DenseNet 第m层有m个输入特征图的组合,包含了从输入层到第 m-1 层一共m层的输出特征图。
然后第m层自身的输出特征图又传递到后续的L-m 的每一个层的输入当中(其中L是总层数)。

性质1: DenseNet网络需要的的参数更少

这种稠密连接的模式带来的一种违反自觉的效果是它比传统的网络需要更少的参数量。因为它不需要学习多余的特征图。

具体来说,传统的卷积网络随着前向传播过程通道数是逐渐增多的,因为它不仅需要保存早期层的信息,也要保存当前层的信息。
然而DenseNet网络每层的通道数是固定的,而且很窄(比如12)。因为早期层的信息都会传递过来,它只需要很少的卷积核去提取当前层的信息即可。

性质2: DenseNet改善了信息和梯度在网络中的流动,使得网络很容易训练。

每一层都可以直接从损失函数和原始输入信号中获得梯度,从而实现隐式的深度监督,使得训练过程更加容易。

性质3: 实验观测到DenseNet这种网络连接模式有正则化的功效,在小数据集上能够减少过拟合。

二、 相关研究

现在的网络结构越来越多的层扩大了架构之间的差异,激发了研究人员对不同连接模式的探索,和对研究思路的重新审视。

2.1 对网络深度的研究

Highway是采用门控单元来实现的快捷连接。这个很好理解,对于网络中的某一层,传统网络的思路是通过一个非线性函数转换后得到一个输出并传递给下一层。而Highway 是采用一个门控单元,那么就有两种可能,一种是和传统网络一样传递一个非线性转换的结果,一种是直接不做转换,将输入的数据作为输出向后传递。
这样做的好处是在网络训练过程中,对于网络中不做转换的层,梯度信息可以直接传递到前面的层。使得训练过程更加容易。

ResNet,也同样和HighWay有相似的实现,它是在传统网络的基础上添加了一个捷径路径(恒等映射)。

stochastic depth 是成功的训练了一个1202层的ResNet,采用了训练过程中随机丢弃若干层的思路。

2.2 对网络宽度的研究

GoogLeNet 采用 Inception模块来组合不同大小的卷积核生成的特征图。

一个具有更宽的残差模块的ResNet 变体被提出;实际上,简单的增加ResNet每一层的卷积核的数量也能提升模型的表现。

2.3 相关研究小结

作者表示代替于研究更深或者更宽的网络结构,DenseNet 致力于通过特征复用的方式来探索网络的潜力,得到一个容易训练且参数高效的浓缩模型。

三、DenseNet 网络

假设 x l x_l xl为第l层的输出特征图; H l ( ) H_l() Hl()表示第l层的非线性转换函数,可以理解为BN、ReLU、Conv、Pooling这些操作的组合。

那么对于传统的卷积网络,第l层的输出特征图可以用公式如下表示:

x l = H l ( x l − 1 ) x_l = H_l(x_l-1) xl=Hl(xl1)

对于ResNet网络,第l层的输出特征图可以用公式如下

x l = H l ( x l − 1 ) + x l − 1 x_l = H_l(x_l-1) + x_l-1 xl=Hl(xl1)+xl1

对于DenseNet网络,第l层的输出特征图可以用公式如下

x l = H l ( [ x 0 , x 1 , x 2 , . . . . . . x l − 1 ] ) x_l = H_l([x_0, x_1, x_2, ......x_l-1]) xl=Hl([x0,x1,x2,......xl1])
其中 [ x 0 , x 1 , x 2 , . . . . . . x l − 1 ] [x_0, x_1, x_2, ......x_l-1] [x0,x1,x2,......xl1]表示第0层到第l-1层的输出特征图在通道方向上的拼接。

3.1 池化层

在上述DenseNet的表达式中,我们可以知道第l层的输入是第0层到第l-1层的输出特征图在通道方向上的拼接。那么必须保证这些特征图空间尺寸必须是一致的。

而我们也知道,卷积网络中的一个必不可少的部分是下采样层,它会改变特征图的大小。

为了便于在网络中使用下采样,我们将网络拆分为多个稠密连接的稠密块(dense blocks)。我们将两两稠密块之间的层称之为过渡层,过渡层实现卷积和池化功能,具体包含了一个BN层、一个1 * 1的卷积层、一个2 * 2的平均池化层。如下图所示。

3.2 增长率

如果每一层都输出k个特征图,那么第l层的输入特征图的个数是 k 0 + k ∗ ( l − 1 ) k_0 + k * (l-1) k0+k(l1),其中 k 0 k_0 k0表示输入的特征图数量。

DenseNet与其他卷积网络一个很重要的区别就是DenseNet的层很窄(即通道数很少,比如k=12)。我们将超参数k称为网络的增长率。在后面第4章可以看到,一个很小的增长率足够与当前最先进的网络相匹敌。

3.3 瓶颈层

尽管每一层只输出k个特征图,那么第l层的输入特征图的个数是 k 0 + k ∗ ( l − 1 ) k_0 + k * (l-1) k0+k(l1),也是很多的。

那么我们可以在设计稠密块(Dense Block)时,我们可以在3 * 3的卷积之前,先加入一个1 * 1 的卷积作为瓶颈层。我们知道 1 * 1卷积的作用不会改变特征图的空间维度,而是调整通道数量、以及通道方向上的特征融合。

在这里,我们就是用来降低输入特征图的通道数,从而提升计算效率。

我们将具有瓶颈层的DenseNet 叫做DenseNet-B。

3.4 压缩

为了提升模型的紧凑性,我们减少了在过渡层的特征图数量。如果一个稠密块输出了m个特征图,我们设置过渡层输出的特征图个数为 θ m \\theta m θm。其中 θ \\theta θ 称之为压缩因子。

我们将 θ < 1 \\theta < 1 θ<1 的DenseNet 叫做DenseNet-C。

因此,结合上文,如果DenseNet不仅具有瓶颈层,同时压缩因子小于1,那么我们称这样的模型结构为DenseNet-BC。

3.5 DenseNet网络结构图

下图展示了DenseNet-121、DenseNet-169、DenseNet-201、DenseNet-264四种网络结构。

咱们以DenseNet-121为例介绍其中的关键点:

  • 设置增长率k=32,表示Dense Block模块中每层输出的feature map 的数量是32。
  • 在Dense Block (1)内有6个 1 * 1和3 * 3的子结构,虽然每个子结构的输出特征图个数都为32;但下一个子结构不仅接收上一层输出特征图,还接收Dense Block内之前所有子结构的输出特征图,那么对于下一个子结构来说,它的输入特征图的数量是很大的。以第6个子结构为例,它的输入特征图个数为 k 0 + 5 ∗ 32 k_0+5*32 k0+532。其中 k 0 k_0 k0为上一个Dense Block的输出特征图个数。因此,1 *1 卷积作为瓶颈层,将输出特征图数量降维到 4 k = 128 4k=128 4k=128,能有效减少参数个数和计算复杂度。
  • 在四个Dense Block之间,都有一个过渡层(Transition Layer),过渡层中的1 * 1卷积仍然是为了降维;2 * 2的平均池化是实现降采样。
  • 在最后一个Dense Block 之后,接了一个全局平均池化,这里是学习GoogLeNet的做法。

四、实验

4.1 在CIFAR 和SVHN上的实验结果

准确率

最值得注意的趋势可能是从上表的底部一行开始。这表明 DenseNet-BC的 L = 190和 k = 40 在所有 CIFAR 数据集上的性能都优于现有的最新水平。它的错误率在 C10+ 上为3.46% ,在 C100+ 上为17.18% ,错误率明显低于wide ResNet 网络。

在 C10和 C100上的最佳结果(没有使用数据增强)甚至更令人鼓舞: 两者都比具有drop-path的 FractalNet 网络错误率低近30% 。

在 SVHN数据集中,L = 100和 k = 24的DenseNet 也超过了wide ResNet 网络。然而,250层的DenseNet-BC并没有进一步改善其性能。这可能是因为 SVHN 是一个相对简单的任务,而且非常深入的模型可能对训练集造成了过拟合。

容量

在没有瓶颈层与压缩层的情况下,随着L和k的增加,DenseNet的性能表现越来越好。我们把这主要归因于相应的模型容量的增长。

在C10+ 和 C100+ 数据集上的实验很好地证明了这一点。

关于 C10+,随着参数数目从1.0 M 增加到7.0 M 增加到27M,错误率从5.24下降到4.1 ,最后降到3.74。

C100+ 也有类似的趋势。

这表明DenseNet可以利用更大和更深模型所增加的表示能力, 这也表明它们没有过度拟合以及没有残差网络的优化困难。

参数效率

表2的结果表明,DenseNet比其他架构(特别是ResNet)更有效地利用参数。其中DenseNet-BC的参数效率特别高。

过拟合

更有效地使用参数的一个积极的作用是DenseNet倾向于不太容易过度拟合。

4.2 在ImageNet的实验结果

作者用不同的深度L和增长率k 来评估 DenseNet-BC 的 ImageNet 分类任务,并与最先进的网络结构ResNet 进行比较。

为了确保在两种架构之间进行公平的比较,我们通过采用ResNet公开使用的实现,来消除了所有其他因素,如数据预处理和优化设置的差异。(这里是想说明除了网络结构之外,其他数据预处理、训练过程的优化参数都保持一致)

左图中横坐标是模型参数,纵坐标是验证集的错误率。我们可以看到在相同的错误下,DenseNet的参数数量更少;在相同的参数数量下,DenseNet 的错误率更低。

右图是计算复杂度与验证集错误率的关系,和左图的分析结果是类似的。

五、对这篇文章的总结

传统网络中每层网络仅与其前后相邻两层相连。在刘壮与合作者的研究中,CNN中的短路连接被发挥到极致,使得网络中每两层都相连,这样得到的网络模型称为密集连接的卷积网络(Densely Connected Convolutional Networks,DenseNets)。DenseNet的优点包括缓解了训练神经网络中著名的梯度消失现象,加强了特征的前向传播和重利用,以及大大提高了参数利用效率。在一系列图片分类数据集上,DenseNet在参数使用较少的情况下,均取得了显著的效果提升。

参考文献

https://iiis.tsinghua.edu.cn/show-6425-1.html

https://arxiv.org/abs/1608.06993

以上是关于DenseNet --CVPR 2017年 最佳论文的主要内容,如果未能解决你的问题,请参考以下文章

DenseNet详解

论文阅读 CVPR2017(Best Paper) Densely Connected Convolutional Networks

改进YOLOv5 | 引入密集连接卷积网络DenseNet思想 | 搭建密集连接模块

详解和对比ResNet和DenseNet和MobileNet

详解和对比ResNet和DenseNet和MobileNet

DenseNet——CNN经典网络模型详解(pytorch实现)