ResNeXt、DenseNet、CSPNet网络模型总结

开源代码:https://github.com/xxcheng0708/Pytorch_Image_Classifier_Template


ResNeXt

在网络架构设计层面,常见的几种提升网络性能的方法:

  1. 网络的宽度width:每层卷积的输出通道数
  2. 网络的深度depth:网络的层数
  3. 网络的分辨率resolution:输入图像的分辨率大小
  4. 网络的增长率growth:随着层数的增加,每层卷积输出通道数的增长比例
  5. 网络的特征复用:如DenseNet可以使用更浅的网络,更少的参数,提升特征复用,达到与深度网络相当的性能
  6. 高效特征融合:InceptionNet的split-transforms-merge模式,将输入分别使用不同的转换分支提取特征,然后将多个分支的结果进行合并实现特征融合

ResNeXT借鉴了VGGNet、ResNet中连续堆叠多个相同或相似block的特性,以及借鉴InceptionNet中split-transforms-merge对特征进行高效融合的特性。

         如上图所示,右图在卷积核的大小,以及输出通道数量上做了设计,使得左右两种结构在参数量和浮点运算量方面相当。右图中,将原本ResNet中的一条分支扩展程32条分支,并且每条分支是完全相同的,最后将各分支的输出结果相加(有点Transformer里面的Multi-Head Attention那味了,只不过Multi-Head Attention是将多个结果进行concat)。上右图的网络结构与下图网络结构是等价的:

         ResNeXt网络在每个分支中使用了bottleneck的结构,也就是先使用1x1卷积进行降维,减少特征图的通道数,然后再进行分组卷积等提取体征,最后再使用1x1卷积进行升维,还原特征图的通道数。ResNeXt中每个block可以表示如下:

        C代表block中分支的数量,T_i代表每个分支的子网络,x表示short-cut连接。

基数cardinality:在ResNeXt中,将上述block中的分支数量称作基数,并且认为基数和网络的宽度width、深度depth同等重要,这一点在DenseNet网络中也可以看出,DenseNet是将基数发挥到极致。

ResNeXt涉及的相关工作及概念

多分支卷积网络:ResNeXt中使用了多分支的子网络进行特征融合

分组卷积:ResNeXt中,使用分组卷积来控制网络的参数量和浮点计算量

压缩卷积网络:不同于常见的以损失模型精度为代价的压缩方法,ResNeXt使用多分支的分组卷积等操作,在控制模型参数量和浮点计算量的前提下,还能进一步提升模型的表达能力

集成算法:由于使用了多分支的子网络进行特征融合,这种操作类似于集成学习方法,不同于集成学习方法的是,ResNeXt中各个分支是完全相同的

ResNeXt与Inception-ResNet的关系

ResNeXt中block的每个分支是完全相同的结构,不需要进行特殊的设计,在Inception-ResNet中,block的每个分支是不同的,经过精心设计的。并且,在ResNeXt中,各个分支的结果使用加法进行合并。

ResNet50与ResNeXt50网络模型对比:

        上表中的ResNeXt在block内部采用的是分组卷积的方式来实现多分支处理。其中,C=32表示在block中有32个分支或者32组分组卷积,d=4表示在block中的每个分支处理4个通道的输入数据,或者说每个分组卷积处理4个通道的输入。

Pytorch版本中ResNeXt的block结构如下:

         可以看到,在128 x 4 x 3 x3卷积部分,将128个通道的输入分成了32组,每组处理4个通道,每组输出4个通道,然后将32组的输出结果concat得到输出的128个通道。


DenseNet

        鉴于ResNet等网络使用shot-cut来实现特征的融合,以及缓解梯度消失问题,DenseNet将这种shot-cut的思想发挥到极致,将网络每个Block中前面层所有分辨率相同的feature map进行融合,而不仅仅只融合上一层的feature map,所以DenseNet每个Block中网络层级之间具有L * (L + 1)/2个连接,所以网络起名叫DenseNet。并且,不同于ResNet的shot-cut采用加法运算,DenseNet采用concat进行feature map的连接。用公式表示如下:

        DenseNet中,第i层的输入与第i层的输出做concat,作为第i+1层的输入,这就要求输入和输出的分辨率保持不变,就是不做下采样操作,下采样操作在transition层进行。

        像上图这样,每一层都可以利用全面所有层学习得到的结果,在使用同样参数量的情况下,特征的重复利用率更高,不需要再进行重复的特征学习。同样的,这种密集连接方式也有利于网络的训练。

DenseNet的网络结构如下:

DenseNet包含以下模块:

Block模块:DenseNet将整个网络划分成多个Block,每个Block里面包含多个conv+BN+Relu的操作,Block内部不做下采样操作(包括卷积下采样和池化下次采样),并且对卷积操作做padding填充,所以这些操作输出相同分辨率大小的feature map,所以在每个Block内部各层的feature map是可以进行concat融合的,在Block模块内部,设置每个卷积层的卷积核数量k,叫做Growth Rate,每层卷积的输入通道为前面所有层的通道数求和 ,输出通道数为k

转换模块:在Block之间的层叫做转换层,转换层使用conv+BN+max pooling完成下采样操作。

瓶颈层Neck:为了进一步提升每个Block模块中卷积操作的效率,在进行每次conv+BN+Relu之前,使用1x1卷积先将输入的feature map在通道维度上进行降维,将原本通道数为 的输入特征图的通道数减少到4k,然后在此基础上进行conv+BN+Relu操作。使用瓶颈层的DenseNet叫做DenseNet-B

通道压缩模块:为了继续降低计算量,提升速度,原本的转换模块使用conv+BN+max pooling完成下采样操作,降低feature map的分辨率大小,在压缩模块,进一步对feature map的通道数进行压缩,假设原本的通道数为m,经过压缩之后的通道数变为 。使用通道压缩的DenseNet叫做DenseNet-C。同时使用瓶颈层和压缩层的叫做DenseNet-BC。

Pytorch版本中DenseNet的部分dense block结构如下: 

         真是将Dense发挥到极致!!!


CSPNet   【CSPNet 解读】一种增强CNN学习能力的新型骨干网络_AI 菌的博客-CSDN博客_csp net有什么用

以DenseNet为例,DenseNet中,后面层的输入是前面层的输出做concat之后得到的,如下:

        在使用后向传播更新参数时,后面层会包含前面层的梯度,如下:

        其中f代表参数更新函数,g表示每一层的梯度,可以看出由于后面层的输入中包含前面层的输出,所以后面层计算的梯度也会包含前面层的梯度。这种就导致了梯度计算的重复,对此进行优化可以对模型进一步加速,因此,此种优化方式适用于使用short-cut的网络,比如DenseNet,ResNet, ResNeXt等。

CSPNet思想

        在原本DenseNet中,前面层的feature map全部传入后面层作为输入,在CSPNet中,将前面层的feature map在通道上一分为二,一部分输入到后面层,一部分直接通过short-cut的方式连接到transition层,这样可以缓解一部分的梯度信息重复计算问题,从而减少模型的计算量和显存占用

Cross Stage Partial DenseNet

        上图是在DenseNet上应用CSP的示意图。

        传统的DenseNet中,第i层的输入与第i层的输出做concat,作为第i+1层的输入,这就要求输入和输出的分辨率保持不变,就是不做下采样操作,下采样操作在transition层进行。

        在CSPDenseNet中,将输入特征数据在通道维度上划分为 输入到DenseNet中, 直接在transition层与DenseBlock的输出在通道维度上做concat。在CSPDenseNet的transition层,先将Dense Block的输出结果 经过一个conv卷积操作,然后和 进行concat得到 ,输入到另一个conv卷积操作得到

        上述图(b)中CSPDenseNet的前向推理过程如下:

        参数更新过程如下:

        经过上述改进之后,CSPDenseNet将原来DenseNet中对于全部feature map的重复梯度计算降低了一半,因为另一半x0' 的feature map不在经过Dense Block,直接送入了transition层。所以这种网络结构叫做Cross Stage Partial DenseNet,就是跨Stage的部分的DenseNet。

        在CSP结构中,几种不同的特征融合变体,其中Fusion Last效果最好:

        CSP结构用于ResNeXT网络:

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值