0%

DenseNet

原文链接:https://arxiv.org/abs/1608.06993

DenseNet原版代码:https://github.com/liuzhuang13/DenseNet

如果出现图像或者公式显示不完整,可以访问如下博客:

CSDN博客:http://blog.csdn.net/Chunfengyanyulove/article/details/79476475

创新点:DenseNet作为2017CVPR最佳论文,其在ResNet基础上,提出了更优秀的shortcut方式,Dense Connection 不仅能使得feature更加强健,还能带来更快的收敛速度。并且DenseNet具有比ResNet更少的参数,在测试时具有更快的速度

简介

在传统的ResNet中,layer与layer之间具有L个connection,DenseNet在ResNet的shorter connection的基础上,在每个Layer之间均加入shorter connection,共包含

$$\frac{L(L+1)}{2}$$

个连接。如下图1所示。
不同于ResNet,DenseNet采用concatenation的方式进行特征图的叠加,而ResNet采用相加的方式进行叠加。
DenseNet 特征重用,使得denseNet更容易去训练,具有更高的效率。
这里写图片描述

图1,5layers dense block

DenseNet需要更少的参数,
作者指出,最近对ResNet的研究表明,ResNet的很多层在训练的过程中贡献较小,甚至可以随机的丢弃一些层,并且ResNet的参数量较大,说明ResNet其实寻找一定的冗余性,基于此,作者提出设计DenseNet,DenseNet网络中的每一层都直接与其前面层相连,实现特征的重复利用;同时把网络的每一层设计得特别窄,即只学习非常少的特征图,达到降低冗余性的目的。

  • DenseNet改善了图像信息以及梯度在网络中的传递,使得训练更加容易。
  • Dense Connection具有正则化效果,可以降低小训练集上的过拟合。

DenseNet

Dense Connectivity

Resnet:

$$x_l=H_l(x_{l-1})+x_{l-1}$$

DenseNet:

$$x_l=H_l([x_0,x_1,…,x_{l-1}])$$

composite function

BN-ReLU-Conv(3*3)

pooling layers

当特征图大小发生变化时候,便无法进行特征图的concatenation操作,因此DenseNet采用block结构,block结构之间设计为BN-Conv(1*1)-Average Pooling(2*2),可利用Conv(1*1)进行模型压缩。
结构如下图所示:

这里写图片描述

Growth rate
由于DenseNet采用的是concatenation的连接方式,如果每层产生k个feature maps,则将会产生

$$k*(l-1)+k_0$$

个特征图,为了防止网络变得很宽,k需要被限制为一个较小的数,作者将k称作growth rate。

bottleneck layers
同样为了降低网络的宽度,DenseNet同样利用1*1卷积进行降维,Dense Block被设计为:
DenseNet-B结构:BN-ReLU-Conv(1*1)-BN-ReLU-Conv(3*3)
其中1*1的filter-num为growth rate 的 4倍
3*3的filter-num为growth rate

Compression
在block之间,可以利用卷积进行模型维度压缩,在本文实验中,作者设置压缩比例为0.5。

block之间的channels变换:
n_channels += units[i]*growth_rate

compression进行模型压缩的channel变化:
n_channels =int(math.floor(n_channels*reduction))

模型详细描述如下:
这里写图片描述

实验

作者首先在CIFAR SVHN ImageNet进行分类实验。

CIFAR 与 SVHN
实验结果如下图所示:

  • 实验表明,在Accuracy中,DenseNet表现非常好,DenseNet-BC(L=190 and k=40)在多个数据集中均具有最好的表现,并且通过实验可以发现,随着DenseNet模型容量的增加,模型的精度有提升。
  • 通过实验可以看出,DenseNet的参数数量较少,说明DenseNet模型参数具有更高的有效性。
  • DenseNet不容易过拟合

这里写图片描述

ImageNet

如下图为ResNet与DenseNet在ImageNet上的实验对比图,作者采用近乎相同的参数配置进行实验,从实验结果如下,左图是在不同的parameters下的实验结果,右图为不同flops下实验的结果。对比可见,DenseNet的优越性。

这里写图片描述

还有一个自然而然的问题就是,这么多的密集连接,是不是全部都是必要的,有没有可能去掉一些也不会影响网络的性能?论文里面有一个热力图(heatmap),直观上刻画了各个连接的强度。从图中可以观察到网络中比较靠后的层确实也会用到非常浅层的特征。

这里写图片描述


20180601补充

densenet 网络结构图:

从该图可以发现,其实densenet的单个结构,类似于将resnet的element-wise sum 变换成为了concat操作,这样带来的一个问题自然是网络特征图的厚度增加会比较明显,所以,作者采用了较小的特征图的维度进行增加,所以densenet初始的number-out就比较小,

如果采用bottle-neck操作,每个block中1*1的卷积和的数量是growth_rate的4倍,估计可能是提高维度会取得较好效果吧,一般bottle-neck在网络层数较深的时候使用。

mxnet,实现代码链接