首先我们从宏观的角度理解一下这篇论文做了什么。这篇论文引入了一个“Dense Block”,该模块的的组成如下图所示(要点就是,Input输入到后续的每一层,每一层都输入到后续层)
在实际应用的时候,如果我们将“Dense Block”作为一个building block,那么可以按照如下的方式构建深度网络结构(是不是一下子就理解了这篇文章做了什么?)。
下面我们来分析一下这个“Dense Block”的一些特点
- “Dense Block”内(包括“Dense Block”的输入)每一层输出feature map的数量是不是有限制呢?
为此,作者引入了一个参数k(growth rate),它表示“Dense Block”内每一层输出feature map的个数。如果“Dense Block”的层数较多、k值较大,那么“Dense Block”最后一层的输入个数是很大的,因此k取值不应该太大。
- 为什么要将Figure 2中“Dense Block”间隔开呢?
在深度网络结构的设计中,pooling layer是一个很重要的因素,作者想用pooling layer。在“Dense Block”内,第L层来自它前面所有层的输入是以“concatenate”的形式组成一个single tensor的,这样就要求它前面所有层具有相同的feature map sizes。这和pooling layer改变feature map sizes的特点相矛盾。作者做了一个折中,以pooling layer为界分割“Dense Blcok”,如Figure 2所示,这样就能够满足上述两个需求了。“Dense Block”之间的层在论文中一个专门的名字“transition layer”。
- “transition layer”的设计
这一层的设计比较常规,“We use 1x1 convolution followed by 2x2 average pooling as transition layers between two contiguous dense blocks”.
- “Dense Block”的设计
该Block输出个数为k,但是输入个数很多,作者采取bottleneck layers的方式减少特定层输入的个数,具体就是BN-Relu-Conv(1x1)-BN-Relu-Conv(3x3),1x1的卷积核将输入的个数限制在4k个feature maps上。
由Figure 1可以看出,“transition layer”的输入个数是最多的。假如“Dense Block”一共有m个feature maps,那么我们将transition layer输出feature maps的个数限制在θm,θ属于(0,1],在实验中作者用的是0.5。
原则上,在上述解释的基础上,去搭建一个网络结构应该不难了。下面给出作者在Imagenet上的网络结构。
最后,我们来分析一下“Dense Block”的优点
- feature reuse
这个很好理解,第L层将它前面所有层的feature maps都利用到了,没有“浪费宝贵的feature maps”。
- 能够缓解梯度消失问题
以输入Input为例,Input通过一个或者几个“transition layer”连接到了loss函数,等效为“在Input与Loss进行了bypass”有利于Loss函数对低层的监督。仔细分析就会发现类似于上述的通路是存在很多的,它们的区别就是“有的通路距离Loss近,有的远”。这样会导致受Loss函数监督程度的差异。
- 更好的参数利用率
就是用更少的参数达到同类模型的准确率,或者同样多参数达到更高的准确率。之所以会出现这种现象,是因为作者引入的“growth rate”这一个概念,以及对“Dense Block”结构巧妙的设计。
总结:
- 这篇paper充分利用了“bypass”以及“feature maps reuse”。
- 如果直接应用上述概念,会出现了一些问题,作者采取巧妙的方式进行了处理(如引入“transition layer”、“growth rate”)。