精简CNN模型以ShuffleNet v2 为例子解释,移动端网络设计的需要的规则ARM、GPU上对比,各种卷积方式的演变跟介绍

news/2024/7/23 21:29:14

参考博客:深度学习【57】ShuffleNet V2  --最好的,下面的文章有些公式显示不了。看这个链接最好

shufflenet部分网络结构  -

变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作。 --要看

介绍

才不久才刚刚写了MobileNet v2的博客,它来自Google。而今天看过了ShuffleNet v2,很是感慨。这篇来自Face++ Sun, Jian团队的paper与Google团行们的作品相比真正是有着鸿泥之别啊。Google的paper大多立足于理论挖掘,提出些似是而非的东东,然后再用实验结果立图去证其非伪,确实难懂,一般情况你不反复读个两、三遍是不会吃透的。。Face++的则立足于实际(可能是因为中国人写的英文比较合乎国人的思维习惯吧),一点点,娓娓道来,一切看上去顺理成章,翻过一遍就能让人恍然大悟,对其妙处更是击节赞赏半天不已。

以往的移动端的CNN设计在考虑计算节省时都直接致力于优化整体网络计算所需的Flops。但实际上一个网络模型的训练或推理过程Flops等计算只是其时间的一部分,其它像内存读写/外部数据IO操作等都会占不小比例的时间。为实际生产考虑,我们不应只限于去片面追求理论Flops的减少,更应该去看所设计的网络实际部署在不同类型芯片上时却具有的实际时间消耗。

在ShuffleNet v2这篇paper中,作者们重点分析了影响在GPU/ARM两种平台上CNN网络计算性能的几个主要指标,并提出了一些移动端CNN网络设计的指导准则(呵呵,这一点做法像是来自于Inception系列或者MobileNet系列文章啊),最终将这些指导准则应用于ShuffleNet v1网络的改良就行成了本篇所讲的ShuffleNet v2。在分类与目标检测等通用任务时与其它流利移动端网络相比,它都取得了不俗的性能。

ShuffleNet_v2与其它移动端网络在准确率_FPS及FLOPs上的比较

高效CNN网络设计的几个指导准则

这篇Paper让做网络优化的工程师读起来会感觉特别亲切,因为它足够地贴地气,像极了平时对应用程序的优化过程。即先对应用程序进行hotspots分析,看时间主要耗在了哪里。然后就分析各个hotspot的原因,再针对性地提出优化办法以减少整体所需的时间从而达到最终的性能指标。

CNN网络时间消耗分析

下图中分析了ShuffleNet v1与MobileNet v2这两个移动端流行网络在GPU/ARM两种平台下的时间消耗分布。

ShuffleNet_V1与MobileNet_V2上的时间消耗分析

从上图中可看出Conv等计算密集型操作占了其时间的绝大多数,但其它像Elemwise/Data IO等内存读写密集型操作也占了相当比例的时间,因此像以往那样一味以FLOPs来作为指导准则来设计CNN网络是不完备的,虽然它可以反映出占大比例时间的Conv操作。

高效CNN网络设计的四个准则

  • 当输入、输出channels数目相同时,conv计算所需的MAC(memory access cost)最为节省,叫内存访问操作所消耗的计算时间

作者们在paper中从理论与实验上证明了此一准则的有效。以下关系表示了MAC与FLOPs(B)及输入、输出channels数目之间的关系。

输入-输出channels数目与MAC之间的关系

下表为其实验佐证。

Input_output_channels_数目与MAC之间的关系

  • 过多的Group convolution会加大MAC开销。

下面公式表明了在Group convolution操作中MAC与g之间的正比例关系。

MAC与group_convolution中g的正比例关系

下表结果则为其实验佐证。

group_convolution中groups_数目与MAC之间的关系

  • 网络结构整体的碎片化会减少其可并行优化的程序。

下表为作者在GPU/ARM两种平台上设计的分析并行/串行两种网络碎片方式对整体FPS所可能具有的影响。

网络碎片化程度对FPS的影响结果

  • Element-wise操作会消耗较多的时间,不可小视。

Element-wise操作是一种典型的memory access密集操作。所以它对整个网络计算所需的时间影响也挺大,不可轻视。下表为使用Element-wise操作前后网络所具有的FPS结果。

Element-wise_OP对网络计算时间的显著影响

ShuffleNet v2

ShuffleNet v1分析

在ShuffleNet v1的操作中充满了对上述章节介绍过的四个设计准则的违反。首先它使用了bottleneck 1x1 group conv与module最后的1x1 group conv pointwise模块,使得input channels数目与output channels数目差别较大,违反了上述规则一与规则二;其次由于它整体网络结构中过多的group conv操作的使用从而违反了上述规则三;最后类似于Residual模块中的大量Element-wise sum的使用则进而违反了上述规则四。

ShuffleNet v2的设计

ShuffleNet v2中弃用了1x1的group convolution操作,而直接使用了input/output channels数目相同的1x1普通conv。它更是提出了一种ChannelSplit新的类型操作,将module的输入channels分为两部分,一部分直接向下传递,另外一部分则进行真正的向后计算。到了module的末尾,直接将两分支上的output channels数目级连起来,从而规避了原来ShuffleNet v1中Element-wise sum的操作。然后我们再对最终输出的output feature maps进行RandomShuffle操作,从而使得各channels之间的信息相互交通。。精彩至极,看至此处已然拍案叫绝。

跟ShuffleNet v1一样,它也提供了一种需要downsampling的模块变形。为了保证在下采样的时候增加整体输出channels数目,它取消了模块最开始时的RandomSplit操作,从而将信处向下分别处理后再拼结,使得最终outptu channels数目实现翻倍。

说了一大通,更是直接看下图吧。下图中的a/b为原ShuffleNet v1中具有的两种模块结构。图c/d则为ShuffleNet v2中的模块设计。

ShuffleNet_V2的模块设计与ShuffleNet_V1的对比

下表为ShuffleNet v2的整体网络结构。它亦具有MobileNet系列模型中所使用过的缩减系数来控制accuracy与efficiency之间的平衡。

ShuffleNet_v2的整体网络结构

实验结果

下表中涵盖了Paper中进行的广泛实验。从中可看出ShuffleNet v2相对其它移动端网络所具有的分类精度及计算效率上的性能优势。

ShuffleNet_v2与其它网络在分类精度及时间复杂性与模型大小上的比较

参考文献

  • ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design, Ningning-Ma, 2018



作者:manofmountain
链接:https://www.jianshu.com/p/71e32918ea0a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


http://www.niftyadmin.cn/n/1691410.html

相关文章

.sync修饰符与v-model的区别

https://segmentfault.com/a/1190000015388871 https://blog.csdn.net/liushijun_/article/details/92426854 https://www.jianshu.com/p/6b062af8cf01 https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-%E4%BF%AE%E9%A5%B0%E7%AC%A6

深度学习知识十三:pytorh-inception多分支辅助分类、shortcut、densenet、 DepthWise深度可分离卷积、ShuffleNet的channel shuffle

参考博客:变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作。 pytorch微调网络Inception3 CNN网络架构演进:从LeNet到DenseNet 1、inception的多分支卷积: 最初的Inception的卷积如下: 其是对输入进行多…

pytorch进行上采样的种类

1、其中再语义分割比较常用的上采样: 其实现方法为: def upconv2x2(in_channels, out_channels, modetranspose):if mode transpose:# 这个上采用需要设置其输入通道,输出通道.其中kernel_size、stride# 大小要跟对应下采样设置的值一样大…

tomcat各目录(文件)作用

原文:https://www.cnblogs.com/hym-pcitc/p/5603293.html 主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹,下面对他们分别进行介绍: 1.bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结尾的…

Java 手动实现单链表(尾插法和头插法)

原文:https://blog.csdn.net/joob000/article/details/81196165 头插法: 头插法的实现相对简单 思路是将新形成的节点的下一个赋值为header 再把新形成的节点地址传给header即将header向前移动 import java.util.Random; import java.util.Scanner;pub…

Cannot cast object ‘2021-03-11‘ with class ‘java.lang.String‘ to class ‘java.sql.Date‘

考察把字符串类型日期装换为java.sql.Date()类型 步骤: 1.先String转为 java.util.Date 2.再将java.util.Date转为java.sql.Date,方法是获取自1970年到现在的毫秒数,这样就可以根据毫秒数生成相同的时间 例一 // 1.String转为 java.util.D…

zip迭代tensor数据、求topk的简单方法,shape[:-1],[::-1]的用法

1、zip函数可以获取可迭代数据的元素,其中包括各种list、tuple、Tensor等元素 下面是一个例子: testzip [[1, 2], [1, 3], [2, 3], [3, 3]] print("单参数时的输出:") for tuplesin in zip(testzip):#tuplesin出来的数据是([1,…

hiprint在Vue.js+Element UI的使用

原文:https://blog.csdn.net/byc233518/article/details/107705278 官网: http://hiprint.io/ demo: http://hiprint.io/demo/list 官网介绍: hiprint 是一个web 打印的js组件,无需安装软件。支持windows,macOS,linux 系统,支持移动端&…