DenseNet
DenseNet出自《Densely Connected Convolutional Networks》。
论文链接:DenseNet论文
本文参考:DenseNet:比ResNet更优的CNN模型
简介
目前CNN已成为计算机视觉识别领域中的主流方法,伴随计算机硬件和网络结构的改进,真正的深度CNN得以实现。但随着CNN深度的不断增加,产生了这样的一个问题:输入或梯度经过很多层达到网络终点时会消失。当然,无数的科研领袖和精英前辈已经提出了可以解决该问题的方法:
- ResNet/Highway Network通过短连接(identity shortcut connection)将来自一层的信息与下一层连接起来;
- Stochastic depth network通过随机去掉ResNet中的一些层(randomly dropout)以实现更好的信息流和梯度流;
- FractalNets反复将几个并行层序列与不同数量的卷积块组合在一起,以获得较大的标称深度,同时在网络中保留许多短连接。
尽管这些方法是不同的,但它们有一个共同的特性——短连接(skip-connection),也就是在不同的层之间添加一些额外的连接,这也是本文主人公DenseNet的一个核心思想。(原谅我的表达不是那么好😶,毕竟词穷)。
可以认为DenseNet(以下简称为DN)是基于ResNet(以下简称为RN)进行了一些小小的改进,虽然只是小动作,但其带来的性能提升却是非常巨大的!ok,那就进入正文吧~
DenseNet概述
相关概念
密集连接(dense connection)
上面提到目前深度网络存在着信息/梯度消失的问题,那么为了确保层与层之间信息流的最大化,DN将具有相同特征图尺寸的所有层直接相互连接,为保留前馈传播的特性,将这种连接方式确定为:
每一层以其先前所有层的特征图作为输入,而该层自身的特征图则作为所有后续层的输入。
下图简单描述了这种密集连接方式:
因此假设一个网络具有
L
L
L层,对于普通网络而言是具有
L
L
L个连接,而在DN
中应当具有
L
(
L
+
1
)
2
\frac{L(L+1)}{2}
2L(L+1)个连接。所以作者管他们的网络叫密集卷积网络(Dense Convolutional Network (DenseNet))。
网络的前馈传播:
与ResNet不同之处
融合方式
-
RN中对应短连接的特征融合方式为逐元素相加(ele-wise +),这种方式实际上可能影响网络中的信息流;
-
而在DN中,将特征融合的方式更改为串联(concatenate),所以某层的输入应当包含其先前所有层的特征图。这一方式实质上鼓励了特征重用,同时减少了网络的参数量,因为不用重复的学习冗余的特征啦~
- 传统的前馈卷积网络直接把 l t h l^{th} lth的输出 x l x_l xl传递给下一层 l + 1 t h {l+1}^{th} l+1th,也就是这样的传递方式: x l = H ( x l − 1 ) x_l=H(x_{l-1}) xl=H(xl−1); -
RN中由于添加了identity skip-connection,它的传递方式因此也发生了改变: x l = H ( x l − 1 ) + x l − 1 x_l=H(x_{l-1})+x_{l-1} xl=H(xl−1)+xl−1。这里采用的融合方式就是逐元素相加(ele-wise +);
-
在DN中由于每一层都与之前的所有层之间存在连接,因此以其先前所有层的特征图 x 0 , x 1 , ⋯ , x l − 1 x_0,x_1,\cdots,x_{l-1} x0,x1,⋯,xl−1作为输入,即: x l = H ( [ x 0 , x 1 , ⋯ , x l − 1 ] ) x_l=H([x_0,x_1,\cdots,x_{l-1}]) xl=H([x0,x1,⋯,xl−1]),其中 [ x 0 , x 1 , ⋯ , x l − 1 ] [x_0,x_1,\cdots,x_{l-1}] [x0,x1,⋯,xl−1]就代表了层 0 , ⋯ , l − 1 0,\cdots,l-1 0,⋯,l−1的特征图的串联结果。
DenseNet的优点
- 减轻了梯度消失
- 增强了特征传播
- 鼓励特征重用
- 减少了参数量
- 更少的计算量实现更好的性能
关于特征重用
个人理解就是因为每个短连接融合特征图的方式是串联,所以之前学到的特征图就可以再次利用,从而实现高效参数利用率。这种融合方式也在一定程度上增强了特征的传播,改善了整个网络的信息流和梯度流,从而使得网络更易训练。同时因为每一层都可以通过损失函数和原始输入直接访问梯度,相当于一种隐式的深度监督,反正就也是简化了网络的优化和训练吧。
关于参数量减少
乍一听这个名字我也以为DN的参数量要超乎寻常的多,然而它的参数量要比RN少的多得多。原因在于DN不需要学习冗余的特征,我们可以将传统的卷积网络看作是带有一种“状态”的算法,这种“状态”是逐层传递的,那么每一层就会从它的上一层读取该“状态”,对其进行修改后再将其传给下一层。在这一过程中,这个“状态”新增了该层学到的信息并完成了信息传递。
那么RN就是通过identity短连接来明确每一层学到的信息以及保留下来的信息(也就是残差
F
(
x
)
=
H
(
x
)
−
x
F(x)=H(x)-x
F(x)=H(x)−x)。但关于RN的新近研究表明,RN中存在许多冗余,并且每一层都要学习一个新权重,这就导致RN的参数量超级大。而我们的DN明确区分了保留的信息和新学到的信息,并且只会向网络中添加很小一部分的特征图,其余的特征图都保持不变,本质的原因还是因为特征重用吧,个人理解。
网络架构
非线性转化函数 H l ( ⋅ ) H_l(\cdot) Hl(⋅)
文中指出 H l ( ⋅ ) H_l(\cdot) Hl(⋅)作为一个复合函数,包含了三个操作:
- BN: Batch Normalization
- ReLU: rectified linear unit
- Conv: 3 × 3 3\times3 3×3 convolution
池化与密集块(dense block)
上面我们提到DN对于特征图的融合方式为串联,前提就是得特征图尺寸相同才可以,所以针对特征图不同的前后层,作者考虑在网络中加入下采样层(也就是池化层)来改变特征图尺寸,所以整个网络通过池化层分成了多个密集连接的dense block,看图:
密集块中间的层称为过渡层(transition layer),包括卷积与池化操作。在作者进行的实验中,过渡层包括了BN、
1
×
1
1\times1
1×1 conv、
2
×
2
2\times2
2×2 average pooling。
增长率(growth rate)
文中引入了一个超参数 k k k,表示每个非线性转化函数 H l ( ⋅ ) H_l(\cdot) Hl(⋅)输出特征图的个数,那么对 l t h l^{th} lth而言,输入特征图的个数为 k 0 + k ( l − 1 ) k_0+k(l-1) k0+k(l−1),其中 k 0 k_0 k0表示输入层的通道数。和现有网络不同的一点是,DN可以通过非常小的 k k k来获取很好的性能,大概是因为随着网络层数的增加,特征重用产生的优势就更大吧。
瓶颈层(bottleneck layer)
接上一点,当每层都会输出
k
k
k个特征图的时候,输入就会随着网络层数的加深而不断增多。为了减少计算量,作者考虑在网络中引入瓶颈层,即在每个
3
×
3
3\times3
3×3 conv前加入
1
×
1
1\times1
1×1 conv来减少输入特征图的数量,进而提高计算效率。作者将带有瓶颈层BN-ReLU-Conv(
1
×
1
1\times1
1×1)-BN-ReLU-Conv(
3
×
3
3\times3
3×3)的DN称为DenseNet-B。
在实验中作者令
1
×
1
1\times1
1×1 conv输出
4
k
4k
4k个特征图:
压缩层(compression)
另外,由于希望模型可以更加紧凑,因此作者针对连接密集块的过渡层提出了减少特征图数量。假设一个密集块包含 m m m个特征图,那么就令过渡层输出 ⌊ θ m ⌋ \lfloor \theta{m} \rfloor ⌊θm⌋个特征图,其中 0 < θ ≤ 1 0<\theta\le1 0<θ≤1称为压缩因子。显然 θ = 1 \theta=1 θ=1时通过过渡层的特征图数量不会发生改变,文中将 θ < 1 \theta<1 θ<1时的网络称为DenseNet-C,将同时带有瓶颈层与 θ < 1 \theta<1 θ<1的网络称为DenseNet-BC。实验中使用了 θ = 0.5 \theta=0.5 θ=0.5。
实验细节
文中对三个数据集CIFAR、SVNH、ImageNet进行了实验。
关于CIFAR、SVNH
对于这两个数据集,作者采用的网络架构为三个内部层数相同的dense block,其中特征图尺寸依次为 32 × 32 32\times32 32×32、 16 × 16 16\times16 16×16、 8 × 8 8\times8 8×8。
- 初始卷积层输出通道为16;
- 对每个 3 × 3 3\times3 3×3卷积,对输入的每边都进行0-padding一个像素以保证特征图尺寸不发生变化;
- 在两个相邻的dense block之间采用 1 × 1 1\times1 1×1卷积和 2 × 2 2\times2 2×2平均池化;
- 在最后的dense block后添加全局平均池化和softmax分类器。
对普通的DenseNet,进行了如下三种配置的实验:
- { L=40,k=12 }
- { L=100,k=12 }
- { L=100,k=24 }
对改进的DenseNet-BC,实验配置为:
- { L=100,k=12 }
- { L=250,k=24 }
- { L=190,k=40 }
关于ImageNet
实验使用了具有4个dense block的DenseNet-BC结构。
- 输入大小为为 224 × 224 224\times224 224×224;
- 初始卷积层大小为 7 × 7 7\times7 7×7,步长为2,输出通道数为 2 k 2k 2k;
- 其他层的输出通道数均为 k k k;
文中给出了关于ImageNet网络的详细配置参数:
实验结果
去看原文叭哈哈哈哈。总结一句话就是DenseNet在这几个数据集上的表现好的爆炸🤐。
小结
再回顾一下DenseNet为什么表现优秀吧:
-
密集连接,增强了网络中的特征传播,减轻了梯度消失的问题,使得网络反向传播训练更为容易;
-
以concatenate方式融合特征图,实现了特征重用,同时减少了参数量,提高了参数利用率,也使得模型更为紧凑。(这里可以看下原文关于DenseNet和ResNet在参数量和精度方面的对比)
- 隐式深度监督,本质还是因为密集连接使得网络的每一层都可以直接访问最终损失函数计算的误差。
不得不说,看完文章真的感觉作者太NB了,暴风膜拜🤩。
接下来准备看看代码,迎接新一波的秃头作战~