论文阅读笔记:Densely Connected Convolutional Networks(DenseNet)

发表载体:CVPR,2017,最佳论文

作者信息:Gao Huang,Cornell University; Zhuang Liu, Tsinghua University ;Laurens van der Maaten, Facebook AI Research

论文地址:论文下载

代码:代码

1、解决的问题

深度卷积神经网络可以准确有效地解决各类问题,但是随着网络层数的加深,梯度消散的问题愈加严重;而且大规模的网络参数造成了计算量和内存的严重负荷;数据流通不够充分,靠近输出的网络层没有利用到前面的特征。

2、DenseNet网络结构及特点

2.1DenseNet设计思路

DenseNet的提出源于ECCV上一篇随机深度网络(Deep network with stochastic depth)的文章,该文章采用Dropout来改进ResNet。通过在训练过程中随机的丢弃(Dropout)一些网络层,可以显著提高网络的泛化能力。

图1 ResNet网络结构图

ResNet比传统的网络多了shorcut支路和bottleneck结构(1*1*n conv)。

ResNet是直接求和,用公式表示为:

                         

图2 Dropout结构图

思路1::网络中某一层可以不仅仅依赖于紧邻上一层的特征,而可以依赖于更前面层学习到的特征。例如,在一个深度网络中,如果第l层被dropout(丢弃),那么第l+1层就被直接连到了第l-1层;如果第2层--第l层被丢弃,那么第l+1层就被直接连到了第1层。

思路2:在训练过程中,随机丢弃一些网络层并没有破坏网络的收敛性,说明ResNet具有比较明显的冗余性。所以,我们将训练好的ResNet随机去掉几层,对网络的预测结果也不会产生很大的影响。

设计理念:网络中每一层都与前面层相连接,实现特征的重复使用;同时把网络的每一层都设计的特别窄,每一层都只学习到非常少的特征,达到降低网络冗余。

DenseNet是进行拼接,用公式表示为:

2.2DenseNet网络结构

图3 DenseNet网络结构图

DenseNet的网络结构主要包括DenseBlocks和Transition Layers两个部分组成。其中,DenseBlocks的结构图如图3所示,Transition Layers是连接两个DenseBlocks的部分,由卷积层和池化层组成(BN-Conv(1*1)-average Pooling(2*2))。

图4  DenseBlocks结构图

图4中,DenseBlock有5层,每层进行BN-Relu-Conv(3*3)的操作,每层输出的通道数为4(特征图的维度是4)。

在DenseBlock中所有层接受前层输出作为额外输入,并将本层的特征图作为后层的输入。假设一个L层的DenseNet,直接连接有L*(L+1)/2个,如上述5层的DenseNet,具有直接连接5*6/2=15个。

因为Transition Layers中包含的pooling会改变特征图的大小,而DenseBlocks内部某一层的输入是其所有先前层的输出,所以,在DenseBlocks内部的特征图大小是不变的,否则内部各层之间不能进行连接。

 

2.3DenseNet的特点

在前向传播过程中,深层网络可以获得浅层网络提取的特征信息;在反向传播过程中,浅层网络可以获得深层网络的梯度信息,促进了数据在网络各层间的流动(数据充分使用)。

有效缓解了梯度消散问题:如图4中,H4层可以直接用到原始输入信息X0,同时还用到了之前层对X0处理后的信息,这样能够最大化信息的流动。 反向传播过程中,X0的梯度信息包含了损失函数直接对X0的导数,减轻了梯度消散。

密集连接,让网络中的每一层都与其前面的每一层相连,实现特征重用,所以,使用较少的卷积核就可以得到大量的特征图,网络参数和计算量少

 

3.DenseNet参数减少策略

3.1 Bottleneck layers(瓶颈层)

在DenseNet中,第l层会与前面l-1个网络层直接连接,假设增长率(Growth rate)为k,那么第l层的输入为k0+k*(l-1),k0是输入层的维数。因此,Dense Block中的每一层的输入随着网络层数的增加,后面每层输入的维数是很大的。

为了解决这个问题,在Dense Block模块中,加入了Bottleneck单元,即利用1*1*n的卷积操作对特征图进行降维,并设定n=4*k,使得每一层输出特征图的维数是4k,k是增长率。

BN-Relu-Conv(3*3)改进为BN-Relu-Conv(1*1)-BN-Relu-Conv(3*3).

文中将带有Bottleneck layers的网络称为DenseNet-B。

3.2 Compression(压缩)

假设一个L层的Dense Block模块,已经通过Bottleneck 单元进行了降维操作,即模块中每一层输出的维数是4k,那么该模块输出的维数为4k*L,随着L层数的增加,该模块输出特征图的维数也是非常大的。

为了解决这个问题,该文章在Dense Block模块之外的过渡层(transition layers)进行降维操作,使得过渡层输出特征图维数为,其中(0.5)。

文中将带有Compression的网络称为DenseNet-C;Bottleneck layers和Compression均使用的网络称为DenseNet-BC。

3.3参数计算过程(1*1*4k conv)

某层输出通道数由该层卷积核的个数决定;

参数:上一通道数*该层卷积核的大小*该层卷积核的通道数。

图5-1 参数计算1

 

网络结构改进:在3*3*128的卷积之前加上1*1*96的卷积;

在5*5*32的卷积之前加上1*1*16的卷积;

在max pooling之后加上1*1*32的卷积,参数计算如下所示。

图5-2  参数计算2

 

4.实验结果分析

图6 ImageNet的DenseNet结构
图7  CIFAR和SVHN数据集上的错误率

注释:(L表示网络深度,k是增长率。黑色表示最新错误率,蓝色表示最小错误率,+表示对原始数据库进行了扩充。可以看出DenseNet相较于ResNet具有更低的错误率,而且使用了更少的参数)

图8 DenseNet及其变体与ResNet的参数性能对比

注释:(可以看出同样层数的DenseNet的网络参数要少,运算量少,准确率也高,错误率相差仅约3%)

图9 特征热力图(可以看出在较深层中也会用到较浅层提取到的特征)

原作者的一些解释,以供学习:CVPR 2017 最佳论文,作者对于文章的解读

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章