论文 https://arxiv.org/abs/1707.01083

目录

Group Convolution

Group Convolution的用途

pointwise group convolution

channel shuffle

ShuffleUnit

ShuffleNet v1的网络结构

参考


Group Convolution

上图左边是普通卷积,右边是组卷积。

假设输入feature map的shape为C×H×W,卷积核数量为N,则输出feature map的通道数也为N。每个卷积核的shape为C×K×K,则N个卷积核的总参数量为N×C×K×K,输入与输出的连接方式如上图左所示。

Group Convolution是对输入feature map进行分组,然后每组分别进行卷积。假设输入尺寸不变,输出通道数量也不变,假设要分成G个groups,则每组输入feature map的通道数量为C/G,每组的输出feature map的通道数为N/G,每个卷积核的shape为C/G×K×K,卷积核的总数仍为N,每组的卷积核数量为N/G,卷积核只与同组的输入进行卷积,则卷积核的总参数量为N×C/G×K×K,总参数量变为原来的1/G,在本例中,C=12,N=6,G=4,输入和输出的连接方式如上图右所示。

Group Convolution的用途

  • 减少参数量,分成G组,该层的参数量减少为原来的1/G
  • Group Convolution可以看成是structured sparse,每个卷积核的尺寸由C×K×K变成C/G×K×K,可以将其余(C-C/G)×K×K的参数视为0,有时甚至可以在减少参数量的同时获得更好的效果(相当于正则
  • 当分组数量等于输入通道数,卷积核数量也等于输入通道数,即C=G=N时,Group Convolution就变成了Depthwise Convolution,参数量进一步缩减
  • 更进一步,当C=G=N,卷积核的大小与输入feature map也相等,即K=H=W时,输出变成了1×1×C的向量,此时称之为Global Depthwise Convolution (GDC),见MobileFaceNet,可以看成是全局加权池化,与Global Average Pooling (GAP)不同的是,GDC给每个位置赋予了可学习的权重(对于已对齐的图像这很有效,比如人脸,中心位置和边界位置的权重自然应该不同)。而GAP是全局取平均,每个位置的权重相同。

pointwise group convolution

作者注意到,尽管在Xception和ResNeXt这类SOTA模型中,在设计block的过程中引入了深度可分离卷积(depthwise separable convolution)和组卷积(group convolution),从而在模型的表达能力和计算代价之间取得了一个比较好的平衡。但是这些模型在设计时都没有充分考虑到1×1卷积(即逐点卷积 pointwise convolution)的影响,而逐点卷积消耗了大量的时间。例如在ResNeXt中,只有3×3卷积层使用了组卷积,结果就是,在ResNeXt的每个残差单元中,逐点卷积占据了93.4%的乘加运算。因此作者将组卷积也引入到1×1卷积层中,提出pointwise group convolution,大大减小了计算量。

channel shuffle

但是,当多个组卷积堆叠在一起时,会产生一个副作用:某个通道的输出结果,仅来自于一小部分输入通道

从上图中可以很明显的看出,当堆叠两个组卷积时,最终某个组的输出仅和同组的输入有关系,这会导致组之间信息流动的阻塞以及模型表达能力的弱化。为了解决这个问题,作者提出了channel shuffle

如上图所示,channel shuffle就是将第一层组卷积得到的特征进行均匀的重组,使得下一层的组卷积中每一组的输入都来自不同的组,保证了组之间信息的流动。

channel shuffle的代码如下所示

def channel_shuffle(x, groups):"""Channel Shuffle operation.This function enables cross-group information flow for multiple groupsconvolution layers.Args:x (Tensor): The input tensor.groups (int): The number of groups to divide the input tensorin the channel dimension.Returns:Tensor: The output tensor after channel shuffle operation."""batch_size, num_channels, height, width = x.size()assert (num_channels % groups == 0), ('num_channels should be ''divisible by groups')channels_per_group = num_channels // groupsx = x.view(batch_size, groups, channels_per_group, height, width)x = torch.transpose(x, 1, 2).contiguous()x = x.view(batch_size, -1, height, width)return x

ShuffleUnit

ShuffleNet的基本单元是由残差单元改进而来的

如图所示,首先将一开始的1×1卷积改成1×1组卷积并接上channel shuffle层,然后是3×3的深度卷积,注意这里去掉了3×3卷积后的ReLU层,然后再接1×1组卷积,这一层后面没有channel shuffle层。

当stride=1时,shortcut直接进行Add。当stride=2时,将深度卷积层的步长设置为2,原始输入进行stride=2的3×3平均池化,然后两者进行Concat。注意,在论文给出的模型结构中,每个stage的output channel是一定的,因此当stride=2时,最后一个1×1组卷积的输出channel并不是这个stage的output channel,而是output channel - input channel,因此Concat之后得到了通道数为output channel的最终输出。

if self.combine == 'concat':self.out_channels -= self.in_channels

有一个细节需要注意,如论文中的结构图所示,ReLU是跟在Add和Concat之后的,但是在官方实现中,当stride=1时,ReLU是跟在Add之后。但当stride=2时,是先对图右边最后1×1组卷积+BN的结果进行ReLU操作,然后再与原始输入进行Concat。

if self.stride == 1:return F.relu(x + x_proj)
elif self.stride == 2:return torch.cat((self.branch_proj(x_proj), F.relu(x)), 1)

ShuffleNet v1的网络结构

ShuffleNet v1的完整结构如图所示

还有一个细节需要注意,在第一个block也就是Stage2的第一个block中的第一个1×1卷积层不使用组卷积,也就是将conv的group参数设置为1。

参考

Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution - shine-lee - 博客园

ShuffleNet v1相关推荐

  1. 论文笔记:ShuffleNet v1

    ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices ShuffleNet v1 1.四 ...

  2. 第八课:ShuffleNet v1、ShuffleNet v2学习

    前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容.来源于哔哩哔哩博主"霹雳吧啦Wz",博主学习作为笔记记录,欢 ...

  3. 轻量化网络—ShuffleNet V1 V2理解

    轻量化网络-ShuffleNetV2理解 ShuffleNetV2原始论文:https://openaccess.thecvf.com/content_ECCV_2018/html/Ningning_ ...

  4. ShuffleNet V1/V2 | 轻量级深层神经网络

    1.简介 ShuffleNet V1是Face++于2017年提出的轻量级深层神经网络.作者在2018年又提出了基于V1版本改进的ShuffleNet V2版本.ShuffleNet V1中的核心思想 ...

  5. 轻量化神经网络总结:SqueezeNet、Xception、MobileNet v1、MobileNet v2、ShuffleNet v1、ShuffleNet v2

    2016.02 伯克利&斯坦福提出 SqueezeNet 在ImageNet上实现了与Alexnet相似的效果,参数只有其1/50 核心点: 1x1卷积核代替3x3卷积核 Squeeze La ...

  6. 面向Mobile device的CNN模型手工设计与NAS分析总结,MobileNet V1,V2,V3,Efficient,MNasNet以及Efficient network design

    手工方法和NAS的高效网络模型设计总结与分析 这篇文章主要关注对于移动端,资源受限平台的高效神经网络设计(Manually)和搜索(NAS). ​​​​​​高效的CNN设计不只是用在服务器,云端,资源 ...

  7. 论文笔记:ShuffleNet v2

    ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design ShuffleNet v2 1.四个问题 要解决什么 ...

  8. 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception

    https://zhuanlan.zhihu.com/p/32746221 https://zhuanlan.zhihu.com/p/35405071 一.简介 虽然网络性能得到了提高,但随之而来的就 ...

  9. 轻量化网络:ShuffleNet V2

    Guideline 1-4: ShuffleNet V2 疑问: ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture ...

  10. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2

    前言 这个系列已经更新了20多篇了,感谢一直以来大家的支持和等待.前面已经介绍过MobileNet V1,MobileNet V2,MobileNet V3,ShuffleNet V1这几个针对移动端 ...

最新文章

  1. 微生物组-宏基因组分析第8期(报名直播课免费参加线下2020.7,早鸟价仅剩1周)...
  2. python编码读法-python中文读法
  3. 24个笔画顺序表_400个生字笔顺表,孩子照着写,家长省心省力!
  4. excel判断字符串包含另一个字符串_【前端冷知识】如何正确判断一个字符串是数值?...
  5. Rolling element bearing diagnostics using the Case Western Reserve University data-学习笔记
  6. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
  7. 此内容过于真实,引起强烈舒适
  8. Oralce定时任务实际应用
  9. shell脚本样本_Shell脚本
  10. Node.js格式化输出json文件
  11. maven安装教程+Eclipse整合
  12. dorado java_[Java教程]dorado 7 使用总结
  13. php变形的itf条码,itf14条码生成器 第14章生成器.doc
  14. iOS-Property follows Cocoa naming convention for returning ‘owned‘ objects
  15. 把QQ群共享当做网盘用感觉还不错
  16. python给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
  17. codesys 串口通讯实例_串口通讯例子,(已调试成功可以接收数据)
  18. 当我开始爱自己——卓别林
  19. 阿玛机器人_豪华日本声优阵容,《战斗天赋解析系统》让你耳朵怀孕!
  20. Android 9 (P)之init进程启动源码分析指南之三

热门文章

  1. 推荐一个超级好用的XML编辑器
  2. 诺基亚c1 02java软件_诺基亚c1-02详细刷机步骤
  3. python房屋租赁管理系统设计与实现报告_房屋租赁管理系统设计毕业论文
  4. C++实现双线性插值
  5. 一篇关于微信防撤回(文本、图片、语音、视频、名片等...)的Python学习教程
  6. android微信版本怎么升级,微信版本怎么看 微信版本升级更新至最新版本方法介绍...
  7. Python:给信号添加白噪声
  8. GitHub下载指定文件或文件夹
  9. android手表密码忘了咋办,moto 360手表通过Android 5.0系统自动解锁手机教程
  10. MFC 鼠标画线总结