论文泛读 DenseNet:稠密连接的卷积网络
Posted Real&Love
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文泛读 DenseNet:稠密连接的卷积网络相关的知识,希望对你有一定的参考价值。
【论文泛读】 DenseNet:稠密连接的卷积网络
文章目录
论文链接: [1608.06993] Densely Connected Convolutional Networks (arxiv.org)
摘要 Abstract
最近的研究表明,如果在靠近输入层与输出层之间的地方使用短连接(shorter connections),就可以训练更深、更准确、更有效的卷积网络。在这篇文章中,我们基于这个观点,介绍了稠密卷积网络(DenseNet),该网络在前馈时将每一层都与其他的任一层进行了连接。传统的 L L L 层卷积网络有 L L L 个连接——每一层与它的前一层和后一层相连——我们的网络有 L ( L + 1 ) 2 \\frac{L(L+1)}{2} 2L(L+1) 个连接。每一层都将之前的所有层的特征图作为输入,而它自己的特征图是之后所有层的输入。DenseNets有一些很不错的优点:有助于解决梯度消失问题,有利于特征传播,鼓励特征的重复利用,还可以减少参数量。我们在四个目标检测任务(CIFAR-10,CIFAR-100,SVHN和ImageNet)中验证了我们提出了结构。DenseNets在这些数据集上大都有较大的提高,而且使用更少的计算量就可以获得更好的性能。
论文的代码和预训练模型都在https://github.com/liuzhuang13/DenseNet
DenseNet的优点:
- 减轻了梯度消失的问题
- 增强了特征图feature-map的传播,提高了特征图的利用率
- 大大减少了参数量
介绍 Introduction
在视觉检测任务中,卷积神经网络(CNNs)已经成为占有绝对优势的机器学习方法。尽管它们在20年前就已经被提出来,但是计算机硬件和网络结构的改善才使训练深层的卷积网络在最近成为现实。起初的LeNet5有5层,VGG有19层,只有Highway网络和ResNets网络才克服了100层网络的障碍。
随着CNNs网络的加深,也出现了一些新的问题:当输入或梯度信息在经过很多层的传递之后在到达网络的最后(或开始)可能会消失。ResNets网络和Highway网络将旁路信息(bypass signal)进行连接。随机深度(stochastic depth)在训练过程中随机丢掉一些层,进而缩短了ResNets网络,获得了更好的信息和梯度流。FractalNets使用不同数量的卷积block来重复的连接一些平行层,获得更深的网络同时还保留了网络中的short paths。尽管这些方法在网络结构和训练方法等方面有所不同,但它们都有一个关键点:它们都在前几层和后几层之间产生了短路径(short paths)。
在这篇论文中,作者提出了一个结构:为了保证最大信息流在层与层之间的传递,将所有层(使用合适的特征图尺寸)都进行互相连接。为了能够保证前馈的特性,每一层将之前所有层的输入进行拼接,之后将输出的特征图传递给之后的所有层。
论文中也给出了示意图
不过这种结构,与ResNet相反的是,作者并没有将特征传递给某一层之前将其进行相加(combine),而是将其进行拼接(concatenate)。因此,第 l l l 层有 l l l 个输出,这些输出是该层之前所有的卷积块(block)的特征图,而它自己的特征图则传递给之后的所有 而它自己的特征图则传递给之后的所有 L − 1 L-1 L−1 层,所以一个 L L L 层的网络就有 L ( L + 1 ) 2 \\frac{L(L+1)}{2} 2L(L+1) (其实就是 C n + 1 2 C_{n+1}^{2} Cn+12)个连接,而不是像传统的结构仅仅有 L L L 个连接。由于它的稠密连接模块,所以我们更喜欢把这个方法称为稠密卷积网络(DenseNets)。
该稠密连接模块的一个优点是它比传统的卷积网络有更少的参数,因为它不需要再重新学习多余的特征图。在CNN模型里,传统的feed-forward架构可以视为状态模型,状态在层与层之间传播,每一层读取它上一层状态,改变状态并保留一些需要保留的信息并将装备传给下一层。ResNet通过增加额外的identity transformations让状态内需要保留的信息显性化。而有一些论文指出ResNet中有一个非常有意义的现象:**网络的许多层贡献较小并且在训练过程中可以被随机丢弃。**而论文提出的这种DenseNet结构,增加到网络中的信息与保留的信息有着明显的不同。DenseNet层很窄(例如每一层有12个滤波器),仅仅增加小数量的特征图到网络的“集体知识”(collective knowledge),并且保持这些特征图不变——最后的分类器基于网络中的所有特征图进行预测。
除了具有更好的参数利用率,DenseNets还有一个优点是它改善了网络中信息和梯度的传递,这就让网络更容易训练。每一层都可以直接利用损失函数的梯度以及最开始的输入信息,相当于是一种隐形的深度监督(implicit deep supervision)。这有助于训练更深的网络。此外,我们还发现稠密连接有正则化的作用,在更少训练集的任务中可以降低过拟合。
相关工作 Related Work
我这里就总结一下,在深度学习领域中,神经网络呈现一种go deeper的现象,比如说VGG和ResNet和highwayNet,后者甚至可以超过1000层,并取得比较好的结果。除此之外还有一种让网络更深(如跨层连接)的正交法(orthogonal approach)是增加网络的宽度。比如GooLeNet使用了“inception”模块,将不同尺寸的滤波器产生的特征进行组合连接。并且在Inception v4中,提出一种具有广泛宽度的残差模块,它是ResNets的一种变形。
对于本文提出的DenseNet来说,它不是通过很深或者很宽的网络来获得表征能力,而是通过特征的重复使用来利用网络的隐含信息,获得更容易训练、参数效率更高的稠密模型。将不同层学到的特征图进行组合连接,增加了之后层输入的多样性,提升了性能。这同时也指出了DenseNets和ResNets之间的主要差异。尽管inception网络也组合连接了不同层的特征,但DenseNets更简单,也更高效。
DenseNet
ResNet
首先做一个假设,一张图片 x 0 x_0 x0在卷积网络中传播。网络中有 L L L层,每一层都有一个非线性变化 H l ( . ) H_l(.) Hl(.)。 H l ( . ) H_l(.) Hl(.)是一个组合函数,有BN、ReLU、池化或卷积。我们用 x l x_l xl表示 l t h l^{th} lth层的输出
对于我们的ResNet来说,ResNet增加了一个跨层连接,将自身与非线性转换的结果相加
x
l
=
H
l
(
x
l
−
1
)
+
x
l
−
1
x_l=H_l(x_{l-1})+x_{l-1}
xl=Hl(xl−1)+xl−1
ResNets的一个优点是可以直接将梯度从后层传向前层。然而,自身与经过
H
l
H_l
Hl 得到的输出是通过求和的形式来连接的,这可能会阻碍信息流在网络中的传播
稠密连接(Dense connectivity)
为了更好的改善层与层之间信息的传递,我们提出一种不同的连接模式:将该层与之后的所有层进行连接。
x
l
=
H
l
(
[
x
0
,
x
1
,
…
,
x
l
−
1
]
)
x_l=H_l([x_0,x_1,\\dots,x_{l-1}])
xl=Hl([x0,x1,…,xl−1])
其中
[
x
0
,
x
1
,
…
,
x
l
−
1
]
[x_0,x_1,\\dots,x_{l-1}]
[x0,x1,…,xl−1]表示输出的特征图的进行拼接,由于它的稠密连接模式,我们称该网络结构为稠密卷积网络(DenseNet)
组合函数(Composite function)
受到Identity mappings in deep residual network论文的启发,作者将组合函数 H l ( . ) H_l(.) Hl(.)定义为三种操作的组合函数,分别是:BN、ReLU和Conv 3x3卷积。
池化层(Pooling layers)
DenseNet的网络架构如下图所示,了便于下采样的实现,我们将网络划分为多个稠密连接的dense block,网络由多个Dense Block与中间的卷积池化组成,核心就在Dense Block中。Dense Block中的黑点代表一个卷积层,其中的多条黑线代表数据的流动,每一层的输入由前面的所有卷积层的输出组成。注意这里使用了通道拼接(Concatnate)操作,而非ResNet的逐元素相加操作。
我们将每个block之间的层称为过渡层,完成卷积和池化的操作。在我们的实验中,过渡层由BN层、1x1卷积层和2x2平均池化层组成。
增长速率(Growth rate)
如果一个 H l H_l Hl输出 k k k个 f e a t u r e − m a p s feature-maps feature−maps,那么这样的话第 l t h l_{th} lth层就会输出 k 0 + k × ( l − 1 ) k_0+k \\times (l-1) k0+k×(l−1)个特征图。 k 0 k_0 k0是输入层的通道数,如果 k k k太大,就会导致与特征图太多,从而导致模型参数太多。这里我们定义 G r o w t h r a t e Growth rate Growthrate就是超参数$k , 用 于 控 制 ,用于控制 ,用于控制feature maps$的数量。
Bottleneck 层
尽管每层只产生
k
k
k个feature maps,但还是很多。就要用到
1
x
1
1x1
1x1的小卷积来降维了,并且可以提高计算效率。接着定义了Bottleneck layers,结构如下:
B
N
−
R
e
L
U
−
C
o
n
v
(
1
x
1
)
−
B
N
−
R
e
L
U
−
C
o
n
v
(
3
x
3
)
BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3)
BN−ReLU−Conv(1x1)−BN−ReLU−Conv(3x3)
运用了Bottleneck层的结构称为
D
e
n
s
e
N
e
t
−
B
DenseNet-B
DenseNet−B
关于Block,有以下4个细节需要注意:
- 每一个Bottleneck输出的特征通道数是相同的,例如这里的32。同时可以看到,经过Concatnate操作后的通道数是按32的增长量增加的,因此这个32也被称为GrowthRate。
- 这里1×1卷积的作用是固定输出通道数,达到降维的作用。当几十个Bottleneck相连接时,Concatnate后的通道数会增加到上千,如果不增加1×1的卷积来降维,后续3×3卷积所需的参数量会急剧增加。1×1卷积的通道数通常是GrowthRate的4倍。
- 上图中的特征传递方式是直接将前面所有层的特征Concatnate后传到下一层,这种方式与具体代码实现的方式是一致的。
- Block采用了激活函数在前、卷积层在后的顺序,这与一般的网络上是不同的。
压缩 Compression
为了简化模型,我们在过渡层中减小了特征图的数量。如果一个 d e n s e b l o c k dense block denseblock有 m m m个特征图,我们让之后的过渡层生成 ⌊ θ m ⌋ ⌊\\theta m⌋ ⌊θm⌋个输出特征图,其中 0 < θ ≤ 1 0 < \\theta \\le 1 0<θ≤1表示 c o m p r e s s i o n compression compression系数。当 θ = 1 \\theta=1 θ=1时,经过过渡层的特征图数量没有改变,当 0 < θ < 1 0 < \\theta < 1 0<θ<1时, D e n s e N e t DenseNet DenseNet为 D e n s e N e t − C DenseNet-C DenseNet−C,在paper中, θ \\theta θ设为0.5。同时使用compression factor 和 Bottleneck layers的DenseNet记为DenseNet-BC。
实验细节 Implementation Details
- 使用三
以上是关于论文泛读 DenseNet:稠密连接的卷积网络的主要内容,如果未能解决你的问题,请参考以下文章