发表载体: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)一些网络层,可以显著提高网络的泛化能力。
ResNet比传统的网络多了shorcut支路和bottleneck结构(1*1*n conv)。
ResNet是直接求和,用公式表示为:
思路1::网络中某一层可以不仅仅依赖于紧邻上一层的特征,而可以依赖于更前面层学习到的特征。例如,在一个深度网络中,如果第l层被dropout(丢弃),那么第l+1层就被直接连到了第l-1层;如果第2层--第l层被丢弃,那么第l+1层就被直接连到了第1层。
思路2:在训练过程中,随机丢弃一些网络层并没有破坏网络的收敛性,说明ResNet具有比较明显的冗余性。所以,我们将训练好的ResNet随机去掉几层,对网络的预测结果也不会产生很大的影响。
设计理念:网络中每一层都与前面层相连接,实现特征的重复使用;同时把网络的每一层都设计的特别窄,每一层都只学习到非常少的特征,达到降低网络冗余。
DenseNet是进行拼接,用公式表示为:
2.2DenseNet网络结构
DenseNet的网络结构主要包括DenseBlocks和Transition Layers两个部分组成。其中,DenseBlocks的结构图如图3所示,Transition Layers是连接两个DenseBlocks的部分,由卷积层和池化层组成(BN-Conv(1*1)-average Pooling(2*2))。
图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)
某层输出通道数由该层卷积核的个数决定;
参数:上一通道数*该层卷积核的大小*该层卷积核的通道数。
网络结构改进:在3*3*128的卷积之前加上1*1*96的卷积;
在5*5*32的卷积之前加上1*1*16的卷积;
在max pooling之后加上1*1*32的卷积,参数计算如下所示。
4.实验结果分析
注释:(L表示网络深度,k是增长率。黑色表示最新错误率,蓝色表示最小错误率,+表示对原始数据库进行了扩充。可以看出DenseNet相较于ResNet具有更低的错误率,而且使用了更少的参数)
注释:(可以看出同样层数的DenseNet的网络参数要少,运算量少,准确率也高,错误率相差仅约3%)
原作者的一些解释,以供学习:CVPR 2017 最佳论文,作者对于文章的解读