ShuffleNet笔记

1. ShuffleNetV1网络介绍

1.1 channel shuffle

  • 文章提出了channel shuffle操作,可以将group conv后得到的结果融合起来

channel shuffle的实现

         假定将输入层分为 g 组,保证总通道数是 g 的倍数,例如为 g × n  ,首先你将通道那个维度拆分为 ( g , n ) 两个维度,然后将这两个维度转置变成 ( n , g ) 两个维度,最后重新 reshape 成一个维度。

        此时的每一行相当于原来的每一列,再转回原来的一维向量。

def channel_shuffle(x, groups):
    batchsize, num_channels, height, width = x.data.size()

    channels_per_group = num_channels // groups# groups是分的组数
    
    # reshape
    x = x.view(batchsize, groups, 
        channels_per_group, height, width)

    # transpose
    # - contiguous() required if transpose() is used before view().
    #   See https://github.com/pytorch/pytorch/issues/764
    x = torch.transpose(x, 1, 2).contiguous()

    # flatten
    x = x.view(batchsize, -1, height, width)

    return x

1.2 ShuffleNet的block 

 作者认为1x1的普通卷积是很耗费时间的,所以采用了1x1的分组卷积,然后进行channel shuffle操作进行通道重排。

FLOPS 全大写,指的是每秒浮点数运算次数,可以理解为计算的速度,是衡量硬件性能的一个指标(硬件)

FLOPs s小写,指的是浮点运算数,理解为计算量,可以用来衡量算法/模型的复杂度(模型)

论文中常用的 MFLOPs,1MFLOPs = 10^6 FLOPs

论文中常用的 GFLOPs,1GFLOPs = 10^9 FLOPs

但是计算复杂度不能只看 FLOPs,还要参考一些其他指标

与ResNet和ResNeXt网络的参数使用对比 

1.3 ShuffleNet网络结构 

 2. ShuffleNetV2介绍

 2.1 影响计算速率的因素

 以在影响模型推理速度的众多因素中间,我们不能光看 FLOPs,还要考虑其他因素例如内存访问时间成本 MAC (memory access cost)。此外,并行等级 degree of parallelism 也是需要考虑的。相同的 FLOPs 在不同的平台上计算时间也是不同的。

通过下图能发现,我们的卷积还是占据了模型推理的绝大部分时间,但是其他操作例如 data 的 I/O,shuffle 等也占据了相当大的一部分时间。因此 FLOPs 并不能准确评判模型的执行时间 

2.2 四条准则

  • G1:输入输出通道数相同,MAC最小

  • G2:分组数过大的分组卷积会增加MAC

 

  • G3:碎片化操作对并行加速不友好 

  •  G4:逐元素操作带来的内存和耗时不可忽略

 2.3 作者得出结论

  1. 使用“平衡卷积”,即输入输出的通道数应相等

  2. 意识到使用分组卷积的代价

  3. 降低网络的碎片化程度

  4. 减少逐元素操作

对于图c,首先是Channel Split操作,将含c个通道的输入特征图一分为二,一部分含c’个通道,则另一部分还c-c’个通道(论文中是这样表述的,通常是将输入通道数平均分成两份)。左侧分支是一个恒等映射,右侧分支是三个卷积操作,最终将两部分Concat在一起。【注意:这里使用的是Concat,不是Add,因此没有了逐元素操作带来的耗时,满足G4,俩部分Concat结合在一起时,输入输出的通道数是一致的,满足G1】

右侧的三个卷积,注意这时没有采用shuffleNet1提出的分组卷积,而是仅仅使用1x1卷积,没有使用分组卷积自然不要channel shuffle,3x3的DWConv没有进行改变。【注意:这里的三次卷积同样会满足输入输出的通道数相等,满足G1;没有使用分组卷积满足G2】最后就是Concat后又进行了一次Channel shuffle【注意:这里虽然没有使用通道重排,但Split操作是类似channel shuffle的,但又没有使用分组卷积,十分巧妙!!!】

对于图d,是shuffleNet2的下采样模块,和(c)是非常类似的。主要的改变是将DWConv的步长s调整为2,并删除了channel Split的操作。这样做的目的就是要下采样,使特征图尺寸减半,通道数翻倍。


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值