目录

1, DenseNet

1.1 ,  DenseNet如何改变网络的宽度

1.2, DenseNet结构块

1.3,基于 DenseNet结构块的神经网络结构

1.4,DenseNet结构和ResNet之间的关系

2,CliqueNet


1, DenseNet

1.1 ,  DenseNet如何改变网络的宽度

      DenseNet网络增加网络的宽度,主要是通过用其他通道的信息补偿,从而增加网络的宽。              DenseNet网络通过各层之间进行concat,可以在输入层保持非常小的通道数的配置下,实现高性能的网络。

先列下DenseNet的几个优点,感受下它的强大:
1、减轻了vanishing-gradient(梯度消失)
2、加强了feature的传递
3、更有效地利用了feature
4、一定程度上较少了参数数量

1.2, DenseNet结构块

      作者把所有层连接起来,dense block的结构图如下所示:在传统的卷积神经网络中,如果L层,那么就会有L个连接,但在DenseNet中,会有L(L+1)/2个连接;

      先放一个dense block的结构图。在传统的卷积神经网络中,如果你有L层,那么就会有L个连接,但是在DenseNet中,会有L(L+1)/2个连接。简单讲,就是每一层的输入来自前面所有层的输出。如下图:x0是input,H1的输入是x0(input),H2的输入是x0和x1(x1是H1的输出)……
    

 dense block的结构图

     梯度消失问题在网络深度越深的时候越容易出现,原因输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用。

     DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。
    另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck

(瓶颈结构,可以参考1*1的卷积作用章节的内容)layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,

 不同深度的DenseNet结构如下表所示

1.3,基于 DenseNet结构块的神经网络结构

      下图是一个DenseNet的结构图,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有size的问题。

       由于在DenseNet中需要对不同层的feature map进行concat操作,所以需要不同层的feature map保持相同的feature size.为了使用Down sampling,作者将DenseNet分为多个Denseblock。在同一个Denseblock中feature size相同大小,在不同Denseblock之间设置transition layers实现Down sampling。

 结论:
      向前:每一层都可以看到所有的之前的输入,对于网络已经学习到的『知识』(即已有feature map),以及原始输入,都可以直接access到,然后再添加自己的『知识』到全局知识库。鼓励了特征的重用,特征重用就可以减少不必要的计算量。另外,多层之间可以很好地进行交互,每一层都接受前面所有层的输出,具有多层特征融合的特性;
      向后:跳跃结构,可以很近地连接到最后的loss,训练起来很容易,直接接受最终loss的监督,深层监督,解决梯度消失的问题,并且,能起到正则化的作用缓解过拟合;

因为有稠密直连的过程,所以各个feature都要存下来,实际上很容易爆显存,另外,这种稠密连接也意味着反向传播计算梯度更加复杂,每一步训练并不一定会更快。
 

1.4,DenseNet结构和ResNet之间的关系

   ResNet这里的L表示层,xL表示L层的输出,HL表示一个非线性变换。所以对于ResNet而言,L层的输出是L-1层的输出加上对L-1层输出的非线性变换。

      DenseNet的。[x0,x1,…,xL-1]表示将0到L-1层的输出feature map做concatenation。concatenation是做通道的合并,就像Inception那样。而前面resnet是做值的相加,通道数是不变的。HL包括BN,ReLU和3*3的卷积。

 在实际应用中,使用DenseNet结构和ResNet在数据集Imagenet分类数据集上,达到同样的性能,DenseNet所需要的参数不到ResNet参数的一半左右。

2,CliqueNet

       DenseNet 通过复用不同层级的特征图,减少了不同层间的相互依赖性,且最终的预测会利用所有层的信息而提升模型鲁棒性。但是 Yunpeng Chen 等研究者在论文 Dual Path Networks 中表示随着网络深度的增加,DenseNet 中的密集型连接路径会线性地增加,因此参数会急剧地增加。这就导致了在不特定优化实现代码的情况下需要消耗大量的 GPU 显存。而在北大杨一博等研究者提出来的 CliqueNet 中,每个 Clique Block 只有固定通道数的特征图会馈送到下一个 Clique Block,这样就大大增加了参数效率。

      CliqueNet 最大的特点是其不仅有前传的部分,同时还能根据后面层级的输出对前面层级的特征图做优化。这种网络架构受到了循环结构与注意力机制的启发,即卷积输出的特征图可重复使用,经过精炼的特征图将注意更重要的信息。在同一个 Clique 模块内,任意两层间都有前向和反向连接,这也就提升了深度网络中的信息流。  

      CliqueNet旨在进一步提高网络特征的利用率。该网络的思想是:在一个block中,每一层即是其他层的输入,也是其他层的输出

论文:Convolutional Neural Networks with Alternately Updated Clique

论文地址:https://arxiv.org/abs/1802.10419

实现地址:https://github.com/iboing/CliqueNet

    CliqueNet 的每一个模块可分为多个阶段,但更高的阶段需要更大的计算成本,因此该论文只讨论两个阶段。第一个阶段如同 DenseNet 那样传播,这可以视为初始化过程。而第二个阶段如下图所示每一个卷积运算的输入不仅包括前面所有层的输出特征图,同样还包括后面层级的输出特征图。第二阶段中的循环反馈结构会利用更高级视觉信息精炼前面层级的卷积核,因而能实现空间注意力的效果。

如上所示在第一阶段中,若输入 0、1、2 号特征图的拼接张量,卷积运算可得出特征图 3。在第二阶段中,特征图 1 会根据第一阶段输出的 2、3、4 号拼接特征图计算得出,我们可将其称为已更新特征图 1。第二阶段的特征图 3 在输入第一阶段的输出特征图 4 和已更新特征图 1、2 的情况下得出。

由此可以看出,每一步更新时,都利用最后得到的几个特征图去精炼相对最早得到的特征图。因为最后得到的特征图相对包含更高阶的视觉信息,所以该方法用交替的方式,实现了对各个层级特征图的精炼。

   CliqueNet 是一个包含4个网络层的block示意图,unfold的形式结合后面的Table1和公式1会更容易理解。两个概念:一个是block,一个block可以包含多个stage;另一个是stage,表示参数更新的不同阶段。在上图中一个block包含两个stage,stage-I是首次更新,stage-II是第二次更新。熟悉DenseNet网络结构的同学应该可以看出Stage-I的操作和DenseNet是一样的,也就是说前面层的输出concate在一起作为当前层的输入。Stage-II的输入则可以从公式1和Table1看出规律:其他层最新的输出。

Table1是一个包含5个网络层的block示意图,X代表层输出,右上角的(1)或(2)表示stage-I或stage-II。Stage-I的操作和DenseNet类似,Stage-II则是不断用top layer中最新的其他4个层输出作为另一个层的输入去更新对应的权重W
这里写图片描述

 Table1

      前面介绍的这些操作可以用公式来表达,如下所示,公式1表示Clique Block的操作,Xi(k)中的(k)表示stage k,和Table1对应。该公式和前面Figure1和Table1结合看容易理解,公式分两部分,前半部分是相同stage的前面层输出集合作为当前层的输入,后半部分是前stage的后面层输出集合作为当前层的输入。注意这两部分不是前面介绍的两个stage的含义。

 是对stage-I和stage-II的特征做可视化,可以看出stage-II的特征更加集中在目标区域

这里写图片描述

 CliqueNet结构在实际总的应用:

      下图中表示包含3个block的CliqueNet,每个block都会有两个输出:X0和stage-II的输出,这二者通过concate后再接一个global pooling层,作为预测的一部分。因此每个block的输出是该block的输入和该block的stage-II的输出的concate结果。X0表示第一个block的输入,后续每个block的输入是前一个block的stage-II输出经过transition层后得到的结果。文章中提到的一个亮点是:We adopt a multiscale feature strategy to compose the final representation with the block features in different map sizes. 指的就是这里不同block的输入做concate去预测结果。另外要提到的是连接两个block的transition操作,文章采用的是attentional transition(类似SE-Net网络的做法),目的是使得传给下一个block的特征质量更高。
这里写图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐