在DenseNet出现之前,CNN的进化一般通过层数的加深(ResNet)或者加宽(Inception)的思想进行,DenseNet通过对特征的复用提出了一种新的结构,不但减缓了梯度消失的现象参数量也更少.本文通过大量可视化以及参数计算来进行讲解.
目录
- 背景
- DenseBlock
- 非线性组合函数
- Transition层
- 整个结构的计算
- DenseNet的思考
- 参考
背景
当CNN的层数变深时,输出到输入的路径就会变得更长,这就会出现一个问题:梯度经过这么长的路径反向传播回输入的时候很可能就会消失,那有没有一种方法可以让网络又深梯度又不会消失?DenseNet提出了一种很简单的方法,DenseNet直接通过将前面所有层与后面的层建立密集连接来对特征进行重用来解决这个问题,连接方式可以看下面这张图:
![](https://img.haomeiwen.com/i15713115/9b7940dc661b601d.png)
我们可以看到每一层的输出都连接到了后一层,这样对于一个L层的网络来说就会有个连接,这里看完有些摸不着头脑没关系,接下来我们会具体展开.
Dense Block
Dense Block是DenseNet的一个基本模块,这里我们从一般的神经网络说起:
![](https://img.haomeiwen.com/i15713115/bb43704e7d02d0c8.png)
上图是标准神经网络的一个图,输入和输出的公式是,其中是一个组合函数,通常包括BN,ReLU,Pooling,Conv操作.
![](https://img.haomeiwen.com/i15713115/d068f9d15ad2c87e.png)
上图则是ResNet的示意图,我们知道ResNet是跨层相加,输入和输出的公式是.
![](https://img.haomeiwen.com/i15713115/4d50fc15408a477b.png)
而对于DesNet,则是采用跨通道concat的形式来连接,用公式来说则是,这里要注意所有的层的输入都来源于前面所有层在channel维度的concat,我们用一张动图体会一下:
![](https://img.haomeiwen.com/i15713115/4127c7f8a71c8b45.gif)
这里要注意,因为我们是直接跨通道直接做concat,所以这里要求不同层concat之前他们的特征图大小应当是相同的,所以DenseNet分为了好几个Dense Block,每个Dense Block内部的feature map的大小相同.而每个Dense Block之间使用一个Transition模块来进行下采样过渡连接,这个后文会介绍.
这里要补充一个概念,这里有一个参数,称为增长率,指的是每一层的额外通道数,或者说每层的卷积核,假如输入特征图的channel为
,那么第
层的channel数就为
,因为每一层都接受前面所有层的特征图,所以这个
可以很小,通常取12就有不错的结果,我们要注意这个K的实际含义就是这层新提取出的特征.
![](https://img.haomeiwen.com/i15713115/8d7e974293999c38.png)
我们可以通过一张参数计算的图来回顾一下(其中是Dense Block,是Transition模块),我们可以看到每经过一个Dense Block深度就会增加我们增长率乘以其中密集块数量那么多,其中+号就是concat的意思.
![](https://img.haomeiwen.com/i15713115/492bd0558ba5ccae.png)
非线性组合函数
![](https://img.haomeiwen.com/i15713115/bad0c42001af5bb6.gif)
在刚才Dense Block中的非线性组合函数是指BN+ReLU+3x3 Conv的组合,但是出于减少参数的目的,一般会先加一个1x1的卷积来减少参数量.所以我们的非线性组合函数就变成了BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv的结构.
![](https://img.haomeiwen.com/i15713115/2191c432260882b4.png)
Transition层
![](https://img.haomeiwen.com/i15713115/ae00522bf55fdf35.png)
前面提到,Transition层就是用来连接每一个Dense Block,他的构成是1x1的卷积和2x2的AvgPooling,也就是上文提到的下采样,压缩模型的功能.假定上一层得到的feature map的channel大小为,那经过Transition层就可以产生个特征,其中是0和1之间的压缩系数.
整个结构的计算
我们通过一张总的参数计算图过一遍整个DenseNet:
![](https://img.haomeiwen.com/i15713115/d7fab449478b1424.png)
这张参数图很清晰地描述了从单一Dense Block,到内部经过非线性组合函数,再通过Transition层下采样后再连接到下一个Dense Block的计算.
DenseNet的思考
更强的梯度流动
![](https://img.haomeiwen.com/i15713115/8f1b052d678ca53c.png)
DenseNet可以说是一种隐式的强监督模式,因为每一层都建立起了与前面层的连接,误差信号可以很容易地传播到较早的层,所以较早的层可以从最终分类层获得直接监管。
参数更少计算效率更高
![](https://img.haomeiwen.com/i15713115/c333d380e50fc92c.png)
我们可以看到,在ResNet中,参数量与x成正比,而在DenseNet中参数量与xx成正比,因为k远小于C,所以DenseNet的参数量小得多.
保存了低维度的特征
![](https://img.haomeiwen.com/i15713115/9cfdb50d02c43a4d.png)
在标准的卷积网络中,最终输出只会利用提取最高层次的特征.
![](https://img.haomeiwen.com/i15713115/4f7e5744d528f953.png)
而在DenseNet中,它使用了不同层次的特征,它倾向于给出更平滑的决策边界。这也解释了为什么训练数据不足时DenseNet表现依旧良好。
网友评论