当前位置: 代码迷 >> 综合 >> 【论文】DenseNet
  详细解决方案

【论文】DenseNet

热度:1   发布时间:2023-12-13 03:45:40.0

【论文】Huang G , Liu Z , Laurens V D M , et al. Densely Connected Convolutional Networks[J]. 2016.(pdf)

【新颖点】

  • 提出密集连接的方式

DenseNet 优点

缓解了梯度消失的问题,加强了特征传播,鼓励特征重用,大大减少了参数的数量

DenseNet 概述

DenseNet 为了保证网络层之间的最大信息流,将所有层直接彼此连接起来。为了保证前馈特性,每个层从前面的所有层获得额外的输入,并将自己的特征映射传递给后面的所有层

因为不需要重新学习冗余特征图,这种密集连接模式相对于传统的卷积神经网络需要的参数更少。传统的前馈体系结构可以看成是具有一种状态的算法,这种状态从一个层传递到下一个层。每个层从其前一层读取状态并将其写入后续层。每层改变当前的状态,也传递需要保留的信息。但是,这个过程是不可解读,我们不知道哪些信息被改变了,哪些信息没有

DenseNet 显式地将添加到网络的信息和保留信息区分开,密集网层非常窄(例如,每层只有 12 个过滤器),仅向网络的集体知识添加一小组的特征映射,而其余特征保持不练,并且最终分类器会基于网络中的所有特征作出决策

除此之外,DenseNet 还改进了整个网络的信息流和梯度,这使得其更易于训练——每个层都直接访问来自损失函数和原始输入信号的梯度

在这里插入图片描述

DenseNet 原理

假设输入一张图片 X0X_0X0?,经过一个 LLL 层的网络,其中第 iii 层的非线性变换记为 Hi(?)H_i(\cdot)Hi?(?)Hi(?)H_i(\cdot)Hi?(?) 可以是多种操作的累加,第 iii 层的特征记作 XiX_iXi?

ResNet

传统前馈神经网络将第 iii 层的输出 XiX_iXi? 作为 i+1i +1i+1 层的输入,可以写作 Xi=Hi(Xi?1)X_i=H_i(X_{i-1})Xi?=Hi?(Xi?1?)

而 ResNet 增加了 shortcut,于是我们记作 Xi+1=Hi(Xi?1)+Xi?1X_{i+1}=H_i(X_{i-1})+X_{i-1}Xi+1?=Hi?(Xi?1?)+Xi?1?,如果你还记得 ResNet 梯度推导中的这个公式 xL=xl+∑i=lL?1F(xi,Wi)x_L=x_l+\sum^{L-1}_{i=l}F(x_i, W_i)xL?=xl?+i=lL?1?F(xi?,Wi?) 可以发现这个累加的操作其实是会阻碍网络中的信息流

Dense Connectivity

于是,进一步优化信息流的传播,DenseNet 提出了不同的连接方式:引入任何层到后续层的直接连接结果,即 Xl=Hl([X0,X1,?,Xl?1])X_l=H_l([X_0, X_1,\cdots,X_{l-1}])Xl?=Hl?([X0?,X1?,?,Xl?1?]) 其中 [?][\cdot][?] 表示 concatenation,将 X0X_0X0?Xl?1X_{l-1}Xl?1? 层所有特征图按通道组合在一起。这里所用到的非线性变换 H(?)H(\cdot)H(?) 表示 BN + relu + conv3 的组合操作

Pooling Layer

由于在 DenseNet 中需要对不同层的特征图进行组合操作,所以不同层的特征图应该保持相同的大小。于是,这就不可能在每个层之间加入池化层。因此,采用了 Dense Block 的方式,在每个 Dense Block 之间插入卷积和池化

在这里插入图片描述
在同一个 Dense Block 中保持特征图的大小相同,但在不同 Dense Block 之间设置 transition layer 实现下采样

Growth Rate

在 Dense Block 中,假设每一个非线性变换 HHH 的输出为 kkk 个特征图,那么第 iii 层网络的输入便是 k0+(i?1)×kk_0+(i-1)\times kk0?+(i?1)×kk0k_0k0? 表示输入层的通道数。前面说过 DenseNet 不同于传统结构的一个地方在于可以存在很窄的层,如 k=12k=12k=12,这个 kkk 我们就称为网络的 growth rate,它表示了每一层输出特征图的厚度

之所以这么做是因为,在同一个 Dense Block 中每一层都与之前的层连接,我们可以把特征图看做是 Dense Block 的一个全局状态,即集体知识,那么每一层的训练目标就是通过现有的全局状态判断是否需要添加新的更新,每一层的 growth rate 就决定了需要给全局状态更新的信息多少

Bottleneck Layer

虽然 DenseNet 的 growth rate 很小,但是不同层的特征图组合在一起还是会使得通道数大大增加。为了减轻计算难度,还是引入了 1×11\times11×1 卷积层进行降维,经过改善后的非线性变换为 BN + relu + conv1 + BN + relu + conv3

Compression

为了进一步使网络变得紧凑,作者打算减少过渡层上特征图的数量。如果一个 Dense Block 包含 mmm 个特征映射,那么就可以让紧跟着的过度层生成 ?θm?\left \lfloor \theta m \right \rfloor?θm? 个输出特征,θ\thetaθ 作为压缩因子在 [0,1][0, 1][0,1] 内取值,当 θ=1\theta=1θ=1 时过渡层的映射特征数保持不变

网络结构

在这里插入图片描述

隐性监督

对于密集卷积提高网络精度的一种解释是,各层通过较短的连接从损失函数接收额外的监督

deeply-supervised nets 在每一个隐藏层都加入了一个分类器监强制从中间层学习一些有区分度的特征,这个来自损失函数的监督我们就称为深度监督

而 DenseNet 以隐性的方式执行类似的深度监督:网络顶部的单个分类器通过两个或三个过渡层对所有层提供直接监控,同时所有层之间共享相同的损失函数,因此 DenseNet 的损失和梯度就不会过于复杂