本文主要是介绍【论文泛读】 DenseNet:稠密连接的卷积网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【论文泛读】 DenseNet:稠密连接的卷积网络
文章目录
- 【论文泛读】 DenseNet:稠密连接的卷积网络
- 摘要 Abstract
- 介绍 Introduction
- 相关工作 Related Work
- DenseNet
- ResNet
- 稠密连接(Dense connectivity)
- 组合函数(Composite function)
- 池化层(Pooling layers)
- 增长速率(Growth rate)
- Bottleneck 层
- 压缩 Compression
- 实验细节 Implementation Details
- 实验 Experiments
- 讨论DenseNet的优点
- 模型简化
- 隐含的深度监督(implicit deep supervision)
- 特征重复利用
- 总结
论文链接: Densely Connected Convolutional Networks (arxiv.org)
因为 ResNet 提出了跨层链接的思想,这直接影响了随后出现的卷积网络架构,其中最有名的就是 cvpr 2017 的 best paper,DenseNet。
摘要 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
- 使用三个Dense Block
- 每个Block都有相同的层数
- 卷积层使用3x3核,并且采用一个像素的zero-padded来保持特征图的尺寸
- 最后一个Dense Block后接一个global average pooling,再跟softmax分类
- DenseNet { L = 40 , k = 12 } , { L = 100 , k = 12 } , { L = 100 , k = 24 } \{L=40,k=12\},\{L=100,k=12\},\{L=100,k=24\} {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 } \{L=100,k=12\},\{L=250,k=24\},\{L=190,k=40\} {L=100,k=12},{L=250,k=24},{L=190,k=40}
在ImageNet数据集上的网络如下图所示
实验 Experiments
所有的网络都是用SGD来训练的
其中CIFAR and SCHN数据集中,设置batch size 64 for 300 and 40 epochs,learning rate初始设置为0.1,在epoch执行到50%和75%的时候降低10倍。
其他参数
- weight decay = 1e-4
- Nesterov momentum = 0.9
- dropout:在C10,C100,SVHN上,没有使用data augmentation,则在每个卷积层后添加dropout layer(除了第一个),并设置为0.2
在实验中没有发生过拟合和优化困难的问题。并且我们发现DenseNets不易发生过拟合,就算是不用数据增强,也能得到很好的结果。并且与其他的模型相比,可以看到DenseNet相比于ResNet有着更少的参数,更好的测试结果。
L L L表示网络深度, k k k为growth rate。蓝色字体表示最优结果,+表示对原数据集进行data augmentation。DenseNet相比ResNet取得更低的错误率,且参数更少。
讨论DenseNet的优点
模型简化
将输入进行连接的直接结果是,DenseNets每一层学到的特征图都可以被以后的任一层利用。该方式有助于网络特征的重复利用,也因此得到了更简化的模型。DenseNet-BC仅仅用了大概ResNets 1/3的参数量就获得了相近的准确率
隐含的深度监督(implicit deep supervision)
稠密卷积网络可以提升准确率的一个解释是,由于更短的连接,每一层都可以从损失函数中获得监督信息。可以将DenseNets理解为一种“深度监督”(deep supervision)。深度监督的好处已经在之前的深度监督网络(DSN)中说明,该网络在每一隐含层都加了分类器,迫使中间层也学习判断特征(discriminative features)。
DensNets和深度监督网络相似:网络最后的分类器通过最多两个或三个过渡层为所有层都提供监督信息。然而,DenseNets的损失函数值和梯度不是很复杂,这是因为所有层之间共享了损失函数。
特征重复利用
根据设计来看,DenseNets允许每一层获得之前所有层(尽管一些是通过过渡层)的特征图。
三个dense block的热度图如下图所示
可以得出以下结论
- 在同一个block中,所有层都将它的权重传递给其他层作为输入。这表明早期层提取的特征可以被同一个dense block下深层所利用;
- 过渡层的权重也可以传递给之前dense block的所有层,也就是说DenseNet的信息可以以很少的间接方式从第一层流向最后一层;
- 第二个和第三个dense block内的所有层分配最少的权重给过渡层的输出,表明过渡层输出很多冗余特征。这和DenseNet-BC强大的结果有关系;
- 尽管最后的分类器也使用通过整个dense block的权重,但似乎更关注最后的特征图,表明网络的最后也会产生一些高层次的特征。
总结
DenseNet的结构有如下三个特性:
- 神经网络一般需要使用池化等操作缩小特征图尺寸来提取语义特征,而Dense Block需要保持每一个Block内的特征图尺寸一致来直接进行Concatnate操作,因此DenseNet被分成了多个Block。Block的数量一般为4。
- 两个相邻的Dense Block之间的部分被称为Transition层,对于Transition层,它主要是连接两个相邻的DenseBlock,并且降低特征图大小。具体包括BN、ReLU、1×1卷积(Conv)、2×2平均池化操作。1×1卷积的作用是降维,起到压缩模型的作用,而平均池化则是降低特征图的尺寸。
- Transition层可以起到压缩模型的作用。假定Transition的上接DenseBlock得到的特征图channels数为m ,Transition层可以产生 θ m θm θm个特征(通过卷积层),其中 0 < θ ≤ 1 0 <θ ≤1 0<θ≤1是压缩系数(compression rate)。当 θ = 1 θ=1 θ=1时,特征个数经过Transition层没有变化,即无压缩,而当压缩系数小于1时,这种结构称为DenseNet-C,原论文中使用 θ ≤ 0.5 θ≤0.5 θ≤0.5 。对于使用bottleneck层的DenseBlock结构和压缩系数小于1的Transition组合结构称为DenseNet-BC。
这篇关于【论文泛读】 DenseNet:稠密连接的卷积网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!