卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2
前言
这个系列已经更新了20多篇了,感谢一直以来大家的支持和等待。前面已经介绍过MobileNet V1,MobileNet V2,MobileNet V3,ShuffleNet V1这几个针对移动端设计的高效网络,ShuffleNetV2是ShuffleNetV1的升级版,今天就一起来看看这篇论文。论文原文见附录。
介绍
论文首先指出目前大部分的模型加速和压缩的论文在对比加速效果时的指标都是FLOPS,这个指标主要衡量的就是乘法和加法指令的数量。而这篇论文通过一系列实验发现FLOPS并不能完全衡量模型的速度。如Figure1(c)和(d)所示,在FLOPS相同的情况下,速度却有较大的区别。所以接下来就针对相同FLOPS会出现速度差异的这个问题,做了一系列工程实验,并在ShuffleNet V1的基础上提出方法进行改进就得到ShuffleNet V2了。
关键点
论文提出除了FLOPS之外,内存访问消耗的时间是需要计算的,这对速度的影响也比较大。这个指标是后续一些实验的优化目标,下面就将每个实验独立出来理解一下。
实验1
探索卷积层的输入输出特征通道数对MAC指标的影响。
实验结论是卷积层的输入和输出特征数相等时MAC最小,此时模型的速度最快。
这里的结论也可以由理论推导出来,推导过程如下:
假设一个1×11\times 11×1卷积层的输入特征图通道数是c1c1c1,输入特征图尺寸是hhh和www,输出特征通道数是c2c2c2,那么这样一个1×11\times 11×1卷积层的FLOPS就是:B=c1∗c2∗h∗w∗1∗1B = c1*c2*h*w*1*1B=c1∗c2∗h∗w∗1∗1。
接下来看看存储空间,因为是1×11\times 11×1卷积,所以输入特征和输出特征的尺寸是相同的,这里用hhh和www表示,其中h×w×c1h\times w\times c1h×w×c1表示输入特征所需要的存储空间,h×w×c2h\times w\times c2h×w×c2表示输出特征所需空间,c1×c2c1\times c2c1×c2表示卷积核所需存储空间。
所以,MAC=h×w(c1+c2)+c1×c2MAC=h\times w(c1+c2)+c1\times c2MAC=h×w(c1+c2)+c1×c2。
根据均值不等式推出:
MAC>=2hwB+BhwMAC>=2\sqrt{hwB}+\frac{B}{hw}MAC>=2hwB+hwB
再把MAC和B带入式子1就得到(c1−c2)2>=0(c1-c2)^2 >= 0(c1−c2)2>=0,因此等式成立的条件是c1=c2c1=c2c1=c2,也就是输入特征通道数和输出通道特征数相等时,在给定FLOPs前提下,MAC达到取值的下界。
实验2
探索卷积的group操作对MAC的影响。
实验结论是过多的group操作会增大MAC,从而使模型变慢。
Mobilenet V1/V2/V3, ShuffleNet V1,Xception都使用了深度可分离卷积,也就是分组卷积来加速模型,这是因为分组卷积可以大大减少FLOPS。
和前面一样,带group操作的1×11\times 11×1卷积的FLOPs如下所示:
B=h×w×c1×c2/gB = h\times w\times c1\times c2/gB=h×w×c1×c2/g
多了一个除数ggg,ggg表示group数量。这是因为每个卷积核都只和c1/gc1/gc1/g个通道的输入特征做卷积,所以多个一个除数ggg。
同样MAC为:
MAC=h×w×(c1+c2)+c1×c2gMAC=h\times w\times (c1+c2)+\frac{c1\times c2}{g}MAC=h×w×(c1+c2)+gc1×c2
这样就能得到MAC和B之间的关系了,如下面的公式所示,可以看出在B不变时,g越大,MAC就越大。
MAC=h×w(c1+c2)+c1×c2g=MAC=h\times w(c1+c2)+\frac{c1\times c2}{g}=MAC=h×w(c1+c2)+gc1×c2=
h×w×c1+Bgc1+Bh×wh\times w\times c1+\frac{Bg}{c1}+\frac{B}{h\times w}h×w×c1+c1Bg+h×wB。
下面Table2是关于卷积的group参数对模型速度的影响,其中ccc代表c1+c2c1+c2c1+c2的和,通过控制这个参数可以使得每个实验的FLOPS相同,可以看出随着ggg的不断增大,ccc也不断增大。这和前面说的在基本不影响FLOPS的前提下,引入分组卷积后可以适当增加网络宽度相吻合。
实验3
探索模型设计的分支数量对模型速度的影响。
实验结论是模型中的分支数量越少,模型速度越快。
论文用了fragment
表示网络的支路数量。这次实验结果如下:
其中2-fragment-series
表示一个block
中有2个卷积层串行,也就是简单的堆叠。而2-fragment-parallel
表示一个block
中有2个卷积层并行,类似于Inception的整体设计。可以看出在相同FLOPS的情况下,单卷积层(1-fragment
)的速度最快。因此模型支路越多(fragment
程度越高)对于并行计算越不利,导致模型变慢,在GPU上这个影响更大,在ARM上影响相对小一点。
实验4
探索element-wise操作对模型速度的影响。
实验结论是element-wise操作所带来的时间消耗远比在FLOPS上体现的数值要多,因此要尽可能减少element-wise操作。
在文章开头部分的Figure 2:
可以看到FLOPS主要表示的是卷积层的时间消耗,而ElementWise操作虽然基本不增加FLOPS,但是带来的时间消耗占比却不可忽视。
因此论文做了实验4,实验4是运行了10次ResNet的bottleneck
来计算的,short-cut
表示的就是element-wise
操作。同时作者这里也将depthwise convolution
归为element-wise
操作,因为depthwise-wise convolution
也具有低FLOPS,高MAC的特点。实验结果如Table4所示。
ShuffleNet V2 瓶颈结构设计
如Figure3所示。这张图中的(a)
和(b)
是ShuffleNet V1的两种不同的block
结构,两者的差别在于(b)
对特征图分辨率做了缩小。(c)
和(d)
是ShuffleNet V2的两种不同结构。从(a)
和(c)
对比可知(c)
在开头增加了一个通道分离(channel split
)操作,这个操作将输入特征通道数ccc分成了c−c′c-c'c−c′和c′c'c′,在论文中c′c'c′取c/2c/2c/2,这主要是为了改善实验1。然后(c)
取消了1×11\times 11×1卷积层中的分组操作,这主要为了改善实验2的结论,同时前面的通道分离其实已经算是变相的分组操作了。其次,channel shuffle
操作移动到了concat操作之后,这主要为了改善实验3的结果,同时也是因为第一个1×11\times 11×1卷积层没有分组操作,所以在其后面跟channel shuffle
也没有太大必要。最后是将element-wise add
操作替换成concat
,这和前面的实验4的结果对应。(b)
和(d)
的对比也是同理,只不过因为(d)
的开始处没有通道分离操作,所以最后concat
后特征图通道数翻倍。
ShuffleNet V2网络结构
不同stage
的输出通道倍数关系和上面介绍bottleneck
结构吻合,每个stage
都是由Figure3(c)
和(d)
所示的block
组成,block
的具体数量对应于Repeat列。
实验结果
从表中可以看到,ShuffleNet V2在速度和精度上对比众多轻量级网络都是State of Art。
总结
论文的构思很像我们在工作时解决问题的方式,先是分析影响模型的速度可能有哪些因素,然后针对这些因素做出一系列实验,最后针对这些实验提出解决方案,最后得出了这个网络。这种思路在整个开发过程中都是通用的。
附录
- 论文原文:https://arxiv.org/pdf/1807.11164.pdf
- 代码实现:https://github.com/anlongstory/ShuffleNet_V2-caffe
- 参考1:https://blog.csdn.net/u014380165/article/details/81322175
- 参考2:https://zhuanlan.zhihu.com/p/69286266
推荐阅读
快2020年了,你还在为深度学习调参而烦恼吗?
卷积神经网络学习路线(一)| 卷积神经网络的组件以及卷积层是如何在图像中起作用的?
卷积神经网络学习路线(二)| 卷积层有哪些参数及常用卷积核类型盘点?
卷积神经网络学习路线(三)| 盘点不同类型的池化层、1*1卷积的作用和卷积核是否一定越大越好?
卷积神经网络学习路线(四)| 如何减少卷积层计算量,使用宽卷积的好处及转置卷积中的棋盘效应?
卷积神经网络学习路线(五)| 卷积神经网络参数设置,提高泛化能力?
卷积神经网络学习路线(六)| 经典网络回顾之LeNet
卷积神经网络学习路线(七)| 经典网络回顾之AlexNet
卷积神经网络学习路线(八)| 经典网络回顾之ZFNet和VGGNet
卷积神经网络学习路线(九)| 经典网络回顾之GoogLeNet系列
卷积神经网络学习路线(十)| 里程碑式创新的ResNet
卷积神经网络学习路线(十一)| Stochastic Depth(随机深度网络)
卷积神经网络学习路线(十二)| 继往开来的DenseNet
卷积神经网络学习路线(十三)| CVPR2017 Deep Pyramidal Residual Networks
卷积神经网络学习路线(十四) | CVPR 2017 ResNeXt(ResNet进化版)
卷积神经网络学习路线(十五) | NIPS 2017 DPN双路网络
卷积神经网络学习路线(十六) | ICLR 2017 SqueezeNet
卷积神经网络学习路线(十七) | Google CVPR 2017 MobileNet V1
卷积神经网络学习路线(十八) | Google CVPR 2018 MobileNet V2
卷积神经网络学习路线(十九) | 旷世科技 2017 ShuffleNetV1
卷积神经网络学习路线(二十) | Google ICCV 2019 MobileNet V3
欢迎关注GiantPandaCV, 在这里你将看到独家的深度学习分享,坚持原创,每天分享我们学习到的新鲜知识。( • ̀ω•́ )✧
有对文章相关的问题,或者想要加入交流群,欢迎添加BBuf微信:
卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2相关推荐
- 卷积神经网络学习路线(十九) | 旷世科技 2017 ShuffleNetV1
前言 这是卷积神经网络学习路线的第19篇文章,主要为大家介绍一下旷世科技在2017年发表的ShuffleNet V1,和MobileNet V1/V2一样,也是一个轻量级的卷积神经网络,专用于计算力受 ...
- 卷积神经网络学习路线(十七) | Google CVPR 2017 MobileNet V1
前言 这是卷积神经网络的第十七篇文章,Google 2017年发表的MobileNet V1,其核心思想就是提出了深度可分离卷积来代替标准卷积,将标准卷积分成Depthwise+Pointwise两部 ...
- 卷积神经网络学习路线(五)| 卷积神经网络参数设置,提高泛化能力?
前言 这是卷积神经网络学习路线的第五篇文章,主要为大家介绍一下卷积神经网络的参数设置,调参技巧以及被广泛应用在了哪些领域,希望可以帮助到大家. 卷积神经网络的参数设置 这个举个例子来说是最好的,因为直 ...
- Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)
Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...
- 卷积神经网络学习二:tinny_cnn程序试运行
卷积神经网络学习二:tinny_cnn程序试运行 一.下载tiny_cnn的资源,网址:https://github.com/tiny-dnn/tiny-dnn 二.解压文件 其中data文件夹中存放 ...
- 卷积神经网络新手指南之二
导语:本文将进一步探讨有关卷积神经网络的更多细节. 卷积神经网络新手指南之二 引言 本文将进一步探讨有关卷积神经网络的更多细节,注:以下文章中部分内容较为复杂,为了保证其简明性,部分内容详细解释的研究 ...
- 卷积神经网络学习指南_卷积神经网络的直观指南
卷积神经网络学习指南 by Daphne Cornelisse 达芙妮·康妮莉丝(Daphne Cornelisse) 卷积神经网络的直观指南 (An intuitive guide to Convo ...
- 卷积神经网络学习心得
卷积神经网络学习心得 文章目录 卷积神经网络学习心得 一.卷积神经网络 1.卷积 2.池化 3.激活函数 3.全连接层 3.训练过程 二.传播过程 1.卷积神经网络的前向传播过程 1.1卷积层的前向传 ...
- 卷积神经网络:(二)风格迁移——原理部分
卷积神经网络:(二)风格迁移--原理部分 引言 本文是在第一步配置完环境后基础上运行的.使用的为系统直装的python环境(在anaconda环境下一样适用,后面注意的点会提示的.).若想查看环境配置 ...
最新文章
- 望岳物业APP开发过程
- 父元素事件中禁止子元素的事件
- Oracle 数据库设置最大进程数参数方法,oracle最大进程数满了处理方法,sysdba管理员登录报“maximum number of processes (150) exceeded“问题解决
- 活动 | 参与《我的 ,2019 不一样》投稿,千元奖品,等你拿!
- Python爬虫-代理ip池建立
- Spark List组件滚动条加事件使datalist数据发生变化
- AssertJ的SoftAssertions –我们需要它们吗?
- c 调用matlab文件路径,C/C++下调用matlab函数操作说明
- 【LeetCode笔记】20.有效的括号(Java、栈) 21. 合并两个有序链表(Java)
- sqoop增量导入hive_Sqoop 增量导MySQL数据 至Hive
- Objective-C 2.0的运行时编程-消息转发
- CleanShot X for mac(支持标注的截图录屏工具)
- VS2015安装VBpowerpacks工具箱教程
- 使用matlab生成高斯滤波模板_matlab实现图像高斯滤波
- 海康内置4G卡的摄像头设备无法注册EasyCVR平台是什么原因?
- 连入网络中的计算机必须都是,12计算机网络判断题.doc
- [转]Facebook 如何管理150亿张照片
- hangfire的使用
- python实现图片识别汽车
- 证书管理机构——CA(Certificate Authority)
热门文章
- Unity:Firebase接入Apple登录
- word行距设置教程
- 微信小程序实现生成海报并且保存本地
- win7(32bit)下完整的搭建apache(2.2.x)+openssl(0.9.6-1.0.1升级)过程
- 无广告的免费视频存储空间并提供视频上传转码的功能,很不错的哦
- 在windows10上安装图形化ubuntu桌面(亲测有效)
- halcon案例分享
- Win10笔记本WIFI的标志突然变成了一个地球的解决方案(二)
- uni-app开发App上架Apple Store流程(简略版)
- 计算机无法自动连接网络连接,win7系统开机后无线网络无法自动连接的解决方法...