随记:DenseNet
DenseNet
论文:Densely Connected Convolutional Networks
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet
1. 介绍
DenseNet是CVPR2017年的文章,之前的ResNet(解决了随着网络深度的加深,梯度消失问题会愈加明显的问题)主要是将网络做长,Inception(可以自适应学习到各种核)主要是将网络做宽,而DenseNet则是通过对feature的极致利用达到更好的效果和更少的参数。
DenseNet网络结构图如下,在保证网络中层与层之间最大程度的信息传输条件下,直接将所有层连接起来。
在传统的卷积神经网络中,如果你有L层,那么就有L个连接,而在DenseNet中,你将会有L(L-1)/2个连接。每一层都会输入来自前面所有层的输出。
上图只是一个dense block,而下面是一个DenseNet的结构图:
其中各个dense block内的feature map大小需要一致,因为每次后传都需要concatenation。这也是作者分多个dense block的原因,因为分了多个才能使feature map大小有变化。
下面的Table1是整个网络的结构图。
其中,k=32,k=48中的k是growth rate,表示输出feature map的个数。DenseNet-121中121是层的个数(卷积层+全连接层),在这里就是(6+12+24+16)*2+1(7*7conv)+3(Translation layer)+1(fc)=121.
- 根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。
- 每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,`既能降维减少计算量,又能融合各个通道的特征。
- 为了进一步压缩参数,在每两个dense block之间又增加了1*1的卷积操作。称为Translation layer。
如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel到一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。
2. 与ResNet对比
公式上:
ResNet的:
这里的l表示层,x_l表示l层的输出,H_l表示一个非线性变换。所以对于ResNet而言,l层的输出是l-1层的输出加上对l-1层输出的非线性变换
。
DenseNet的:
[x0,x1,…,xl-1]表示将0到l-1层的输出feature map做concatenation。concatenation是做通道的合并,就像Inception
那样。而前面resnet是做值的相加,通道数是不变的。H_l包括BN,ReLU和3*3的卷积。
性能上:
3. 优点
核心是:每一层都会和前面所有层相连,每一层的feature map size 变小,这样的网络结构使得网络更窄,参数更少了,因为加上dense block 之后,每个卷积层的输出feature map数量都很小(小于100),有减轻过拟合的现象;同时这样的连接使得特征和梯度传递更加有效,训练也就方便了。
前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss
,因此就可以减轻梯度消失现象,这样更深网络不是问题。
列下DenseNet的几个优点,感受下它的强大:
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递,更有效地利用feature
3、一定程度上较少了参数数量
【参考】https://blog.csdn.net/u014380165/article/details/75142664