通俗易懂DenseNet

博客:博客园 | CSDN | bloggit

写在前面

在博客《ResNet详解与分析》中,咱们谈到ResNet不一样层之间的信息流通隐含在“和”中,因此从信息流通的角度看并不完全,相比ResNet,DenseNet最大的不一样之处在于,并不对feature map求element-wise addition,而是经过concatenation将feature map拼接在一块儿,因此DenseNet中的卷积层知道前面每一步卷积发生了什么。github

Crucially, in contrast to ResNets, we never combine features summation before they are passed into a layer; instead, we combine features by concatenating them.网络

同ResNet结构相似,DenseNet也是由多个Dense Block串联而成,以下图所示架构

https://arxiv.org/abs/1608.06993

Dense Block与Transition Layer

在每一个Dense Block内部,每一个卷积层能够知道前面全部卷积层输出的feature map是什么,由于它的输入为前面全部卷积层输出的feature map拼接而成,换个角度说,每一个卷积层获得的feature map要输出给它后面全部的卷积层。这里说“每一个卷积层”并不许确,更准确的说法应该是“每组卷积”,后面将看到,一组卷积是由1个\(1\times 1\)卷积层和 1个\(3\times 3\)卷积层堆叠而成,即bottleneck结构app

to ensure maximum information flow between layers in the network, we connect all layers (with matching feature-map sizes) directly with each other. To preserve the feed-forward nature, each layer obtains additional inputs from all preceding layers and passes on its own feature-maps to all subsequent layers.性能

下面看一个Dense Block的示例,学习

https://arxiv.org/abs/1608.06993

图中的\(x\)为feature map,特别地,\(x_0\)为网络输入,\(H\)为一组卷积,同Identity Mappings in Deep Residual Networks采用了pre activation方式,即BN-ReLU-\(1\times 1\)Conv-BN-ReLU-\(3\times 3\)Conv的bottleneck结构。\(x_i\)\(H_i\)输出的feature map,\(H_i\)的输入为concatenation of \([x_0, x_1, \dots, x_{i-1}]\)。定义每一个\(H\)输出的 channel数为growth rate \(k =4\),则\(H_i\)的输入feature map有 \(k_0 + k\times (i-1)\)个channel,特别地,\(k_0\)\(x_0\)的channel数。因此,对于越靠后的\(H\),其输入feature map的channel越多,为了控制计算复杂度,将bottleneck中\(1\times 1\)卷积的输出channel数固定为\(4k\)。对于DenseNet的全部 Dense Block,growth rate均相同。spa

相邻Dense Block 之间经过Transition Layer衔接,Transition Layer由1个\(1\times 1\)卷积和\(2\times 2\)的average pooling构成,前者将输入feature map的channel数压缩一半,后者将feature map的长宽尺寸缩小一半。.net

可见,bottleneck和Transition Layer的做用都是为了提升计算效率以及压缩参数量。

DenseNet网络架构与性能

DenseNet用于ImageNet的网络架构以下,经过上面的介绍,这里的架构不难理解。

https://arxiv.org/abs/1608.06993

DenseNet的Parameter Efficiency很高,能够用少得多的参数和计算复杂度,取得与ResNet至关的性能,以下图所示。

https://arxiv.org/abs/1608.06993

理解DenseNet

DenseNet最终的输出为前面各层输出的拼接,在反向传播时,这种链接方式能够将最终损失直接回传到前面的各个隐藏层,至关于某种Implicit Deep Supervision强迫各个隐藏层学习到更有区分里的特征

DenseNet对feature map的使用方式能够当作是某种多尺度特征融合,文中称之为feature reuse,也能够当作是某种“延迟决定”,综合前面各环节获得的信息再决定当前层的行为。文中可视化了同block内每层对前面层的依赖程度,

For each convolutional layer ‘ within a block, we compute the average (absolute) weight assigned to connections with layers. Figure 5 shows a heat-map for all three dense blocks. The average absolute
weight serves as a surrogate for the dependency of a convolutional layer on its preceding layers.

https://arxiv.org/abs/1608.06993

图中可见每一个Dense Block中每层对前面层的依赖程度,约接近红色表示依赖程度越高,能够看到,

  • Dense Block内,每一个层对其前面的feature map利用方式(依赖程度)是不同的,至关于某种“注意力
  • Transition Layer 以及最后的Classification Layer对其前面相对宏观的特征依赖较高,这种趋势越深越明显

Plain Net、ResNet与DenseNet

这里作一个可能并不恰当的比喻,对比一下Plain Net、ResNet 与 DenseNet。

若是将网络的行为比喻成做画,已知最终但愿画成的样子,但要通过N我的之手,每一个人绘画能力有限,前面一我的画完交给后面的人。

  • Plain Net:前面一我的画完,后面一我的只能参照前一我的画的本身从新绘制一张,尽管他能力有限,但他必须得画。

  • ResNet:前面一我的画完,后面一我的在其基础上做画,他更多地关注当前画与最终画的差别部分,同时他还有不画的权利。

  • DenseNet:当前做画的人能够看到前面全部人的画,同时他还知道你们绘画的顺序以及谁的画工相对更好更可靠,他参照前面全部的画本身从新绘制一张,而后连同前面全部的画一同交给后面的人。

不难看出,ResNet和DenseNet的侧重点不太同样,但大几率应该都比Plain Net画的更好。

因此,要是综合ResNet和DenseNet的能力是否是会画得更好呢?

以上。

参考

相关文章
相关标签/搜索