这篇文章是CVPR2017
的oral
,非常厉害。文章提出的DenseNet(Dense Convolutional Network)
主要还是和ResNet
及Inception
网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效!众所周知,最 近一两年卷积神经网络提高效果的方向,要么深(比如ResNet
,解决了网络深时候的梯度消失问题)要么宽(比如GoogleNet
的 Inception
),而作者则是从feature
入手,通过对feature
的极致利用达到更好的效果和更少的参数。
先列下DenseNet
的几个优点,感受下它的强大:
- 1.减轻了
vanishing-gradient
(梯度消失) - 2.加强了
feature
的传递 - 3.更有效地利用了
feature
- 4.一定程度上较少了参数数量
在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet
,Highway Networks
,Stochastic depth
,FractalNets
等,尽管这些算法的网络结构有差别,但是核心都在于:create short paths from early layers to later layers。那么作者是怎么做呢?延续这个思路,那就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来!
先放一个dense block
的结构图。在传统的卷积神经网络中,如果你有L
层,那么就会有L
个连接,但是在DenseNet
中,会有L(L+1)/2
个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:是input
,的输入是(input),的输入是和(是的输出)……
DenseNet
的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block
的设计,后面有提到在dense block
中每个卷积层的输出feature map
的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训 练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在 很多层之间传递导致的,而现在这种dense connection
相当于每一层都直接连接input
和loss
,因此就可以减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection
有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。
这篇文章的一个优点就是基本上没有公式,不像灌水文章一样堆复杂公式把人看得一愣一愣的。文章中只有两个公式,是用来阐述DenseNet
和ResNet
的关系,对于从原理上理解这两个网络还是非常重要的。
第一个公式是ResNet
的。这里的i
表示层,表示i
层的输出,表示一个非线性变换。所以对于ResNet
而言,i
层的输出是i-1
层的输出加上对i-1
层输出的非线性变换。
第二个公式是DenseNet
的。表示将0
到i-1
层的输出feature map
做concatenation
。concatenation
是做通道的合并,就像Inception
那样。而前面Resnet
是做值的相加,通道数 是不变的。包括BN
,ReLU
和3*3
的卷积。
所以从这两个公式就能看出DenseNet
和ResNet
在本质上的区别,太精辟。
前面的Figure 1
表示的是dense block
,而下面的Figure 2
表示的则是一个DenseNet
的结构图,在这个结构图中包含了3个dense block
。作者将DenseNe
分成多个dense block
,原因是希望各个dense block
内的feature map
的size
统一,这样在做concatenation
就不会有size的问题。
这个Table1就是整个网络的结构图。这个表中的k=32,k=48中的k是growth rate,表示每个dense block
中每层输出的feature map个数。为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block
的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。另外这里每个dense block
的33卷积前面都包含了一个11的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block
之间又增加了11的卷积操作。因 此在后面的实验对比中,如果你看到DenseNet-C
这个网络,表示增加了这个Translation layer,该层的11卷积的输出channel默认是输入channel到一半。如果你看到DenseNet-BC
这个网络,表示既有 bottleneck layer,又有Translation layer。
实验结果
作者在不同数据集上采用的DenseNet
网络会有一点不一样,比如在Imagenet数据集上,DenseNet-BC
有4个dense block
,但是在别的数据集上只用3个dense block
。其他更多细节可以看论文3部分的Implementation Details。训练的细节和超参数的设置可以看论文4.2部分,在ImageNet数据集上测试的时候有做224*224的center crop。
Table2是在三个数据集(C10,C100,SVHN)上和其他算法的对比结果。ResNet
[11]就是kaiming He
的论文,对比结果一目了然。DenseNet-BC
的网络参数和相同深度的DenseNet
相比确实减少了很多!参数减少除了可以节省内存,还能减少过拟合。这 里对于SVHN数据集,DenseNet-BC
的结果并没有DenseNet
(k=24)的效果好,作者认为原因主要是SVHN这个数据集相对简单,更深 的模型容易过拟合。在表格的倒数第二个区域的三个不同深度L和k的DenseNet
的对比可以看出随着L和k的增加,模型的效果是更好的。
Figure3是DenseNet-BC
和ResNet
在Imagenet数据集上的对比,左边那个图是参数复杂度和错误率的对比,你可以在相同错 误率下看参数复杂度,也可以在相同参数复杂度下看错误率,提升还是很明显的!右边是flops(可以理解为计算复杂度)和错误率的对比,同样有效果。
Figure4也很重要。左边的图表示不同类型DenseNet
的参数和error对比。中间的图表示DenseNet-BC
和ResNet
在参数 和error的对比,相同error下,DenseNet-BC
的参数复杂度要小很多。右边的图也是表达DenseNet-BC-100
只需要很少的参数 就能达到和ResNet-1001
相同的结果。
另外提一下DenseNet
和stochastic depth
的关系,在stochastic depth中,residual中的layers在训练过程中会被随机drop掉,其实这就会使得相邻层之间直接连接,这和DenseNet
是很像的。
总结
这篇文章半年前就在arxiv
上挂出来了,听说当时就引起了轰动,后来又被选为CVPR2017的oral,感觉要撼动 ResNet
的地位了,再加上现在很多分类检测的网络都是在ResNet
上做的,这岂不是大地震了。惊讶之余来总结下这篇文章,该文章提 出的DenseNet
核心思想在于建立了不同层之间的连接关系,充分利用了feature
,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非 常好。另外,利用bottleneck layer
,Translation layer
以及较小的growth rate使得网络变窄,参数减少,有效抑制了过拟合,同时计算量也减少了。DenseNet
优点很多,而且在和ResNet
的对比中优势还是非常明显的
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet