DenseNet导读

DenseNet导读

原文:Densely Connected Convolutional Networks - 2017 CVPR 最佳论文

GitHub: https://github.com/liuzhuang13/DenseNet


简介

  卷积神经网络在识别和分类领域的效果显著,近年来CNN网络架构的发展迅猛。2014年GoogleNet让网络变宽,2015年的ResNet让网络变得越来越深,之后的变种网络也层出不穷。而DenseNet作为2017年CVPR的最佳论文,吸取了这两者中最精华的部分,不单纯的堆叠宽度和深度,而是用全新的网络架构来达到相应的效果。并在各个数据集上都取得了很好的效果。

以下是DenseNet的主要优点:

  • 缓解了梯度消失问题
  • 加强了特征在网络中的传递
  • 强调特征重用
  • 减少了参数量

如下图,DenseNet的核心思想:将每一层都与后面的层连接。即对某一层而言,它的输入是前面所有层的输出的连结。
在这里插入图片描述


网络结构

在这里插入图片描述
  如今,从网络架构角度解决深层网络中梯度消失的一个趋势:从之前的层创建一条捷径,直接与后面的层相连。因此,对某一层而言,本文提出了一种将之前所有层的输入与这一层相连的结构,并把这样的网络称为DenseNet。

密集连接(Dense connectivity)

  对每一层的输入,提出了一种“知识集合”(collective knowledge)的概念。如Figure1所示,在这样一个密集块里面,假设初始输入为 x 0 x_0 x0,知识集合为 [ x 0 ] [x_0] [x0]。经过第一层后输出 x 1 x_1 x1,知识集合为 [ x 0 , x 1 ] [x_0, x_1] [x0,x1]。然后将这个知识集合的全部内容作为下一层的输入,然后得到第二层的输出 x 2 x_2 x2,加入知识集合 [ x 0 , x 1 , x 2 ] [x_0, x_1, x_2] [x0,x1,x2]。因此,每一层的输入都是当前的知识集合,这也正是密集连接的思想。而这种构成知识集合的连接操作称为concatenation

组成函数(Composite function)

  在这里,把一系列操作定义为一个组成函数 H ℓ ( ⋅ ) H_\ell(·) H(),包括batch normalization (BN),ReLU,Conv(3×3)。如Figure1所示,即在密集块中每一层的操作。

池化层(Pooling layers)

  众所周知,池化层作为一个下采样操作在卷积网络里是一个很重要的部分。但是由于concatenation操作要求特征图需要有相同的尺寸。因此在该网络中设计了Dense BlockTransition Layers。在前者中只进行组成函数的变换,而把池化层放在了两个Dense Block中间的过渡层里面。在论文中,作者使用了一个BN层+1×1的卷积层+2×2的平均池化层作为一个过渡层。

增长率(Growth rate)

  假设每一次 H ℓ H_\ell H操作都会产生 k k k个特征图,对第 ℓ t h \ell^{th} th层,将会有 k 0 + k × ( ℓ − 1 ) k_0+k×(\ell-1) k0+k×(1)个特征图输入。因此将超参数 k k k称为增长率。这个即是上文提到的“知识集合”(collective knowledge)经过每一层后增加的特征图数量。说白了,这个 k k k就是组成函数 H ℓ H_\ell H中,3×3卷积核的个数。而这里体现出的DenseNet与之前其他网络架构一个很明显的区别就是,DenseNet每一层的输出更窄,即 k k k要远小于其他的网络。别的网络动辄就是一百多个的卷积核,而DenseNet只需要几十个。因为DenseNet重用了之前每一层的输出,即使这一层只新产生了 k k k个输出,但是下一层的输入却有 k 0 + k × ℓ k_0+k×\ell k0+k×。在保证特征足够丰富的前提下, k k k的减小所带来的好处就是参数的大大减少。
在这里插入图片描述

瓶颈层(Bottleneck layers)

  虽然每一次 H ℓ H_\ell H操作只产生 k k k个特征图,但是对下一次的输入而言,就显然会有更多的输入。在ResNet中,1×1的卷积可以用来降维和升维,以减少计算量,如下图所示:
在这里插入图片描述
在Dense Block中,由于知识集合会越来越大,因此考虑在每个3×3的Conv层前加一个瓶颈层,即1×1的Conv层,以此来直接降低输入的维度,以此来提升计算效率。此时, H ℓ H_\ell H操作就变成了BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),并把带有瓶颈层的DenseNet称为DenseNet-B。作者在实验中,控制每个Dense Block输出 4 k 4k 4k个特征图。

压缩(Compression)

  为了进一步提升模型的紧凑型,减少参数,提升效率,将在过渡层对特征图数量进行二次压缩。假设上一个Dense Block输出的特征图为 m m m,在过渡层将重新生成 [ θ m ] [\theta m] [θm]个特征图,其中 0 &lt; θ ≤ 1 0&lt;\theta \leq 1 0<θ1称为压缩率。当 θ \theta θ为1时,特征层数不发生变化。我们对过渡层中加入了压缩因子的DenseNet称为DenseNet-C, 同时在文章的实验中,有压缩率的地方,皆为0.5。而对既有瓶颈层又有压缩的DenseNet称为DenseNet-BC。


在这里插入图片描述
  至此,网络的结构已经大致解释完毕。在Table1中,作者设计了不同层数的DenseNet-BC结构对ImageNet数据集进行测试,选取的增长率 k = 32 k=32 k=32,初始用 2 k 2k 2k个尺寸为7×7步长为2的Conv。在这里试选取某一层说明上述部分结构的作用。选取DenseNet-121中的Dense Block(3),在第23层结束的时候,知识集合已经达到了64+23×32=800层。对于第24层的输入,经过瓶颈层后,生成了4×k=128个新的特征图。然后通过24层,知识集合又增加了32层。所以这个Dense Block最终输出到过渡层的特征图数量为832层。在过渡层进行压缩后生成416层,然后再经过一个Conv和池化层送入下一个Dense Block。


实验结果

  由于文章是吸取了ResNet的一些主要思想,以及ResNet所取得的优越结果。所以实验部分的对比,主要是与ResNet及其变种网络之间的比较。作者也提到,关于本文和ResNet思想上最核心的区别,可以用两个式子来区分。
ResNet:
(1) x ℓ = H ℓ ( x ℓ − 1 ) + x ℓ − 1 x_\ell=H_\ell(x_{\ell-1})+x_{\ell-1}\tag1 x=H(x1)+x1(1)
DenseNet:
(2) x ℓ = H ℓ ( [ x 0 , x 1 , . . . , x ℓ − 1 ] ) x_\ell=H_\ell([x_0, x_1,...,x_{\ell-1}])\tag2 x=H([x0,x1,...,x1])(2)
  另一方面,DenseNet的Dense结构给人一种很密集的错觉,各种连接的加入也让网络显得复杂,计算量更大。实际上,由于特征的重复利用,卷积核数目的减小,以及瓶颈层和压缩层的加入,使得网络参数变得更少,效率变得更高。
以下是DenseNet在 CIFAR and SVHN数据集上的表现以及和其他网络的对比:
在这里插入图片描述
  可以看到,DenseNet在这几个数据集的表现都优于其他算法。同时,在相同深度的网络情况下,DenseNet的参数远少于ResNet。更多的实验结果及细节部分可以浏览原文以获得更好的体验。


总结

  DenseNet提供了一种全新的思路和网络架构,不只着眼于网络的深度,而是更注重于对网络结构的合理分配和利用。DenseNet可以很自然的拓展到上百层的深度,而不会出现优化上的困难。因为在相同的层数下,它能以更少的参数和计算量,获得了更好的效果。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值