Densenet学习笔记

时间:2024-04-13 21:47:29

Densenet总结

论文:《Densely Connected Convolutional Networks》
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet
Caffe版本的GitHub链接:https://github.com/shicai/DenseNet-Caffe

1. 概述

  该论文是2017CVPR最佳的论文,是由康奈尔大学博士后黄高博士、清华大学本科生刘壮所作,作者刘壮在其GitHub上开源出densenet相关的代码。此论文是在resnet以及一些resnet衍生网络的基础之上做出网络模型的创新并得到很好的效果,而且论文通俗易懂。真是响应了一句:“我们都是站在巨人的肩膀上”。

2. 创新思路的源泉

  DenseNet 的想法很大程度上源于对论文随机深度网络(Deep networks with stochastic depth)的分析,发现在训练过程中的每一步都随机地drop一些层,可以显著的提高 ResNet 的泛化性能。这个方法的成功至少带来两点启发:
  (1)  它说明了神经网络其实并不一定要是一个递进层级结构,也就是说网络中的某一层可以不仅仅依赖于紧邻的上一层的特征,而可以依赖于更前面层学习的特征。
  (2)   在训练的过程中随机扔掉很多层也不会破坏算法的收敛,说明了 ResNet 具有比较明显的冗余性,网络中的每一层都只提取了很少的特征(即所谓的残差)。实际上,将训练好的 ResNet 随机的去掉几层,对网络的预测结果也不会产生太大的影响。

3. Densnet优点:

  (1)减轻了vanishing-gradient(梯度消失)
  (2) 加强了feature的传递
  (3) 更有效地利用了feature
  (4) 一定程度上较少了参数数量

4. Densnet核心思想

4.1 Resnet介绍

          Densenet学习笔记
  对于resnet只是将当前输出的feature map和前面输出feature map进行相加,最后的通道数不变。

4.2 Dense block

         Densenet学习笔记
  图1所示就是densnet网络的经典dense block结构的示意图,dense block中每一层的输入都是来自前面所有层的输出,也就是说每一层输出的feature map都会作为后面的层的输入。公式2中的[x0,x1,…,xl-1]表示将0到l-1层的输出feature map进行concatenation(串联)操作,concatenation是做通道的合并,就像Inception那样。也就是说最后通道的叠加,通道数是变化的。网络深度越深的时候越容易出现梯度消失,原因就是输入信息和梯度信息在很多层之间传递导致的,而在densnet中相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。
            Densenet学习笔记
                      图1 densnet 网络部分结构

4.3复合函数(composite function)

  论文受CNN网络的一些经验,对于公式2中的H函数采用了三个连续操作:BN->ReLU->Conv(3*3),称为复合函数。

4.4过渡层(Transition Layer)

  根据公式2进行concatenation串联操作会出现通道数改变的现象,然而在CNN中有conv和pooling层可以下采样进行降维。如图2所示,论文引出过度层(Transition Layer)级联多个dense block,希望将每个dense block内的feature map的size最后能统一,这样在进行concatenation时就不会有size不统一的问题。过度层是由1*1的conv和2*2的pooling层组成。
Densenet学习笔记
                         图2 densnet网络整体流程结构

4.5增长率 (Growth rate)

  如果每个复合函数H输出k个feature map,那么第ℓ层有k0+k×(ℓ−1)个输入feature map,其中k0是输入层的通道数,论文里面将k称为 Growth rate。DenseNet和resnet相比的一个优点是设置很小的k值,使得网络更窄从而参数更少。在 dense block中每个卷积层的输出feature map的数量k都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。另外论文还观察到这种denseblock有正则化的效果,因此对于过拟合有一定的抑制作用,我认为主要是网络通道更窄使得参数减少了,所以过拟合现象减轻。

4.6降低参数创新

  Densnet网络中由于dense block的concatenation链接会使得每层的输入以及每个dense block之间传输的feature map的size很大,从而参数太多,针对此问题论文提出了Bottleneck layers和compression(在过渡层进行处理),最后的网络结构如图3所示。
Densenet学习笔记
                         图3 Densnet-BC网络结构示意图
  (1)瓶颈层(Bottleneck layers)
  论文在每个dense block中3*3的conv(卷积)层前面引入1*1的conv层,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,形成BN->ReLU->Conv(1*1)-> BN->ReLU->Conv(3*3)的结构。称之为Densenet-B结构。
  (2)压缩(Compression)
  为了提高模型的紧密性,论文在过渡层中减少feature map的数量,引入一个参数 ,假设一个dense block输出的feature map是m个,在过渡层引入 后输出的feature map就是 个,0< <1,论文中 取0.5,当 <1时称为其结构为Densenet-C。
  注:这里再详细说下bottleneck和transition layer操作
  在每个Dense Block中都包含很多个子结构,以DenseNet-169的Dense Block(3)为例,包含32个1*1和3*3的conv操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel是32(growth rate),那么如果不做bottleneck(也就是引入1*1的conv)操作,第32层的3*3的conv操作的输入就是31*32+上一个Dense Block的输出channel,近1000了。而引入1*1的conv,论文中的1*1conv的channel是growth rate*4也就是128,然后再作为3*3的conv的输入。这就大大减少了计算量,这就是bottleneck。
  至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用1*1的conv来降维。还是以DenseNet-169的Dense Block(3)为例,虽然第32层的3*3的conv输出channel只有32个(growth rate),但是紧接着还会像前面几层一样有通道的concatenation操作,即将第32层的输出和第32层的输入做concatenation,前面说过第32层的输入是1000左右的channel,所以最后每个Dense Block的输出也是1000多的channel。因此在transition layer有个参数 (范围是0到1),表示将这些输出缩小到原来的多少倍,论文给出的是0.5。这样传递给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。

4.7实验对比

  图3所示是DenseNet-BC和ResNet在Imagenet数据集上的对比,左边那个图是参数复杂度和错误率的对比,可以看出在相同错误率下看参数复杂度,也可以在相同参数复杂度下看错误率,提升还是很明显的。右边是flops(可以理解为计算复杂度)和错误率的对比,同样有效果。
Densenet学习笔记
                         图3 实验结果对比