Densenet121网络理解

论文:密集连接卷积网络
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet
MXNet版本代码(有ImageNet预训练模型):https://github.com/miraclewkf/DenseNet
dense block中每个H操作33卷积前面都包含了一个11的卷积操作,称为bottleneck layer,目的是减少输入的feature map数量,一方面降维减少计算量,又能融合各个通道的特征。Transition层包括一个1x1的卷积和2x2的AvgPooling,结构为BN+ReLU+1x1 Conv+2x2 AvgPooling。
Densenet121网络理解
层数数不清楚可以看这个图片。
Densenet121网络理解
Dense Block
从图中可以看到,第一个DenseBlock包含6个[11 conv, 33 conv], 此处的[11 conv, 33 conv]即为Bottleneck结构,具体如下:
Densenet121网络理解
此处的BN-ReLU放在卷积前面(有文章实验证明过这样效果更好).
网络四个优点
1、减轻梯度消失
2、提高了特征的传播效率
3、提高了特征的利用效率
4、减小了网络的参数量

1.卷积神经网络CNN在计算机视觉物体识别上优势显著,典型的模型有:LeNet5, VGG, Highway Network, Residual Network.
2.CNN越深则效果越好,但是,会面临梯度弥散的问题,经过层数越多,则前面的信息就会渐渐减弱和消散。
3.目前已有很多措施去解决以上困境:
(1)Highway Network,Residual Network通过前后两层的残差链接使信息尽量不丢失
(2)Stochastic depth通过随机drop掉Resnet的一些层来缩短模型
(3)FractalNets通过重复组合一些平行的层序列来保证深度的同时减轻这个问题。
但这些措施都有一个共性:都是在前一层和后一层中都建立一个短连接。比如,酱紫:
Densenet121网络理解
DenseNet(密集卷积网络)主要还是和ResNet及Inception网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效值!众所周知,最近一两年卷积神经网络提高效果的方向,要么深(比如RESNET,解决了网络深时候的梯度消失问题),要么宽(比如GoogleNet的盗梦空间),而作者则是从功能入手,通过对功能的极致利用达到更好的效果和更少的参数。
先放一个密块的结构图。在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L + 1)/ 2个连接。。简单讲,每就是一层的输入侧来自前面所有层的输出如下图产品:X0是输入,H1的输入是X0(输入),H2的输入是X0和X1(X1是H1的输出)
Densenet121网络理解
二、网络结构

  1. 紧密连接(Dense connectivity)
    在DenseNet结构中,讲每一层的输出都导入后面的所有层,与ResNet的相加不同的是,DenseNet结构使用的是连结结构(concatenate)。这样的结构可以减少网络参数,避免ResNet中可能出现的缺点(例如某些层被选择性丢弃,信息阻塞等)。
  2. 组成函数(Composite function)
    Batch Normalization + ReLU + 3*3 Conv层
  3. 过渡层(Transition Layer)
    过渡层包含瓶颈层(bottleneck layer,即11卷积层)和池化层。
    1)瓶颈层
    1
    1的卷积层用于压缩参数。每一层输出k个feature maps,理论上将每个Dense Block输出为4k个feature maps,然而实际情况中会大于这个数字。卷积层的作用是将一个Dense Block的参数压缩到4k个。
    2)池化层
    由于采用了Dense Connectivity结构,直接在各个层之间加入池化层是不可行的,因此采用的是Dense Block组合的方式,在各个Dense Block之间加入卷积层和池化层。
  4. 增长率(Growth rate)
    这里的增长率代表的是每一层输出的feature maps的厚度。ResNet,GoogleNet等网络结构中经常能见到输出厚度为上百个,其目的主要是为了提取不同的特征。但是由于DenseNet中每一层都能直接为后面网络所用,所以k被限制在一个很小的数值。
  5. 压缩(Compression)
    跟11卷积层作用类似,压缩参数。作者选择压缩率(theta)为0.5。
    包含bottleneck layer的叫DenseNet-B,包含压缩层的叫DenseNet-C,两者都包含的叫DenseNet-BC。
    DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种密
    另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。
    文章中只有两个公式,是用来阐述DenseNet和ResNet的关系,对于从原理上理解这两个网络还是非常重要的。
    第一个公式是ResNet的。这里的l表示层,xl表示l层的输出,Hl表示一个非线性变换。所以对于ResNet而言,l层的输出是l-1层的输出加上对l-1层输出的非线性变换。
    Densenet121网络理解
    第二个公式是DenseNet的。[x0,x1,…,xl-1]表示将0到l-1层的输出feature map做concatenation。concatenation是做通道的合并,就像Inception那样。而前面resnet是做值的相加,通道数是不变的。Hl包括BN,ReLU和3
    3的卷积。
    Densenet121网络理解
    所以从这两个公式就能看出DenseNet和ResNet在本质上的区别,太精辟。
    前面的Figure 1表示的是dense block,而下面的Figure 2表示的则是一个DenseNet的结构图,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有size的问题。
    Densenet121网络理解
    这个Table1就是整个网络的结构图。这个表中的k=32,k=48中的k是growth rate,表示每个dense block中每层输出的feature map个数。为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。另外这里每个dense block的33卷积前面都包含了一个11的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block之间又增加了11的卷积操作。因此在后面的实验对比中,如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的11卷积的输出channel默认是输入channel到一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。
    再详细说下bottleneck和transition layer操作。在每个Dense Block中都包含很多个子结构,以DenseNet-169的Dense Block(3)为例,包含32个11和33的卷积操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel是32(growth rate),那么如果不做bottleneck操作,第32层的33卷积操作的输入就是3132+(上一个Dense Block的输出channel),近1000了。而加上11的卷积,代码中的11卷积的channel是growth rate4,也就是128,然后再作为33卷积的输入。这就大大减少了计算量,这就是bottleneck。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用11的卷积核来降维。还是以DenseNet-169的Dense Block(3)为例,虽然第32层的33卷积输出channel只有32个(growth rate),但是紧接着还会像前面几层一样有通道的concat操作,即将第32层的输出和第32层的输入做concat,前面说过第32层的输入是1000左右的channel,所以最后每个Dense Block的输出也是1000多的channel。因此这个transition layer有个参数reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。
  6. DenseNets
    第一点差别就是方程 参数的多少,ResNet的参数只是上一层,DenseNet的参数是前面 i 层;第二点差异就是是否有identity变量,论文认为这个identity function是不需要的,会损害信息的流动:
    However, the identity function and the output of are combined by summation, which may impede the information flow in the network.
    在图1时就介绍这种思想其实是有很多漏洞的,之后论文就开始补漏洞了:
    3.1 漏洞一:pooling
    因为神经网络从输入到输出趋势就是channel数逐渐增加,feature map逐渐缩小,而使feature map缩小的操作就是pooling,pooling前后feature map不一样,这种情况下concatenation是没有用的,这种情况下论文将一个大网络分成几个dense blocks,中间使用transition layers(一个作用就是pooling)进行连接,具体如图2所示:
    Densenet121网络理解
    3.2 漏洞二: 指数增长的通道数
    3.3 漏洞三:参数过多