转载自 https://zhuanlan.zhihu.com/p/141178215 侵删
在DenseNet出现之前,CNN的进化一般通过层数的加深(ResNet)或者加宽(Inception)的思想进行,DenseNet通过对特征的复用提出了一种新的结构,不但减缓了梯度消失的现象参数量也更少.本文通过大量可视化以及参数计算来进行讲解.
目录
- 背景
- DenseBlock
- 非线性组合函数
- Transition层
- 整个结构的计算
- DenseNet的思考
- 参考
背景
当CNN的层数变深时,输出到输入的路径就会变得更长,这就会出现一个问题:梯度经过这么长的路径反向传播回输入的时候很可能就会消失,那有没有一种方法可以让网络又深梯度又不会消失?DenseNet提出了一种很简单的方法,DenseNet直接通过将前面所有层与后面的层建立密集连接来对特征进行重用来解决这个问题,连接方式可以看下面这张图:
我们可以看到每一层的输出都连接到了后一层,这样对于一个L层的网络来说就会有L(L+1)/2个连接,这里看完有些摸不着头脑没关系,接下来我们会具体展开.
Dense Block
Dense Block是DenseNet的一个基本模块,这里我们从一般的神经网络说起:
.
这里要注意,因为我们是直接跨通道直接做concat,所以这里要求不同层concat之前他们的特征图大小应当是相同的,所以DenseNet分为了好几个Dense Block,每个Dense Block内部的feature map的大小相同.而每个Dense Block之间使用一个Transition模块来进行下采样过渡连接,这个后文会介绍.
非线性组合函数
在刚才Dense Block中的非线性组合函数是指BN+ReLU+3x3 Conv的组合,但是出于减少参数的目的,一般会先加一个1x1的卷积来减少参数量.所以我们的非线性组合函数就变成了BN+ReLU+1x1 Conv+BN+ReLU+3x3 Conv的结构.
Transition层
整个结构的计算
我们通过一张总的参数计算图过一遍整个DenseNet:
这张参数图很清晰地描述了从单一Dense Block,到内部经过非线性组合函数,再通过Transition层下采样后再连接到下一个Dense Block的计算.
DenseNet的思考
更强的梯度流动
DenseNet可以说是一种隐式的强监督模式,因为每一层都建立起了与前面层的连接,误差信号可以很容易地传播到较早的层,所以较早的层可以从最终分类层获得直接监管。
参数更少计算效率更高
保存了低维度的特征
在标准的卷积网络中,最终输出只会利用提取最高层次的特征.
而在DenseNet中,它使用了不同层次的特征,它倾向于给出更平滑的决策边界。这也解释了为什么训练数据不足时DenseNet表现依旧良好。