文章目录

简介

DenseNet(Dense Convolutional Network,2017),它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。DenseNet的另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能,DenseNet也因此斩获CVPR 2017的最佳论文奖。

稠密块

任意函数的泰勒展开式(Taylor expansion),它把这个函数分解成越来越高阶的项。在$x$接近0时:$$f(x)=f(0)+f'(0)x+\frac{f”(x)}{2!}x^2+\frac{f”'(x)}{3!}x^3+\cdots$$

而ResNet可以看作将函数展开为:$$f(x)=x+g(x)$$

也就是说,ResNet将$f$分解为两部分:一个简单的线性项和一个复杂的非线性项。 那么再向前拓展一步,如果我们想将$f$拓展成超过两部分的信息呢? 一种方案便是DenseNet。

如上图所示,ResNet与DenseNet的关键区别在于,DenseNet输出是连接(用图中的$[,]$表示)而不是如ResNet的简单相加。 因此,在应用越来越复杂的函数序列后,我们执行从$x$到其展开式的映射:

$$x\to [x,\ f_1(x),\ f_2([x,f_1(x)]),\ f_3([x,f_1(x),f_2([x,f_1(x)])]),\cdots]$$

最后,将这些展开式结合到多层感知机中,再次减少特征的数量。 实现起来非常简单:我们不需要添加术语,而是将它们连接起来。 DenseNet这个名字由变量之间的“稠密连接”而得来,最后一层与之前的所有层紧密相连。 稠密连接如下图所示。

稠密网络主要由2部分构成:稠密块(dense block)过渡层(transition layer)。 前者定义如何连接输入和输出,而后者则控制通道数量,使其不会太复杂。

稠密块的代码实现

过渡层

由于每个稠密块都会带来通道数的增加,使用过多则会过于复杂化模型。 而过渡层可以用来控制模型复杂度。 它通过1×1卷积层来减小通道数,并使用步幅为2的平均汇聚层减半高和宽,从而进一步降低模型复杂度。

DenseNet模型

DenseNet首先使用同ResNet一样的单卷积层和最大汇聚层。

接下来,类似于ResNet使用的4个残差块,DenseNet使用的是4个稠密块。 与ResNet类似,我们可以设置每个稠密块使用多少个卷积层。

在每个模块之间,ResNet通过步幅为2的残差块减小高和宽,DenseNet则使用过渡层来减半高和宽,并减半通道数。

与ResNet类似,最后接上全局汇聚层和全连接层来输出结果。

优点

1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量