Shufflenet解读

article/2025/11/10 18:05:10

论文:ShuffleNet: AnExtremely Efficient Convolutional Neural Network for Mobile Devices

论文提到模型加速的方法为:

1)  修剪网络,减少分支(pruningnetwork connections)。

2)  对于一个训练好的网络(pre-trainedmodel),在性能不下降的情况下减少冗余的分支。

3)  量化(quantization)和因式分解(factorization)加速。

4)  在不改变参数的情况下,使用FFT算法对卷积进行加速。

5)  提取网络的精华部分,减小网络模型。


转载网址:https://www.zuinow.com/n5325233.html

旷视(Face++)孙剑等人的研究团队最近发表了《ShuffleNet:一种极高效的移动端卷积神经网络》针对移动端低功耗设备提出了一种更为高效的卷积模型结构,在大幅降低模型计算复杂度的同时仍然保持了较高的识别精度,并在多个性能指标上均显著超过了同类方法。

1、               ShuffleNet的设计思想

卷积神经网络是现代视觉人工智能系统的核心组件。近年来关于卷积模型的研究层出不穷,产生了如VGGResNetXceptionResNeXt等性能优异的网络结构,在多个视觉任务上超过了人类水平。然而,这些成功的模型往往伴随着巨大的计算复杂度(数十亿次浮点操作,甚至更多)。这就限制了此类模型只能用于高性能的服务器集群,而对于很多移动端应用(通常最多容许数百万至数千万次浮点操作)则无能为力。

解决这一难题的方法之一是设计更为轻量级的模型结构。现代卷积神经网络的绝大多数计算量集中在卷积操作上,因此高效的卷积层设计是减少网络复杂度的关键。其中,稀疏连接(sparse connection)是提高卷积运算效率的有效途径,当前方法中采用depthwiseconvolutionpointwise convolution 或者是groupconvolution的方法减少参数量(例如,谷歌的”Xception“网络引入了深度可分离卷积的概念,将普通的卷积运算拆分成逐通道卷积(depthwise convolution)和逐点卷积两部进行,有效地减少了计算量和参数量;而Facebook“ResNeXt”网络[2]则首先使用逐点卷积减少输入特征的通道数,再利用计算量较小的分组卷积(group convolution)结构取代原有的卷积运算,同样可以减少整体的计算复杂度。

ShuffleNet网络结构同样沿袭了稀疏连接的设计理念。作者通过分析XceptionResNeXt模型,发现这两种结构通过卷积核拆分虽然计算复杂度均较原始卷积运算有所下降,然而拆分所产生的逐点卷积(pointwise convolution)计算量却相当可观,成为了新的瓶颈。

受ResNeXt的启发,作者提出使用逐点分组卷积(pointwise group convolution来代替原来的结构,并且通过通道重排(channel shuffle)实现不同group组的featuremap的信息交流。



如上图1 1(a)所示通过将卷积运算的输入限制在每个组内,模型的计算量取得了显著的下降。然而这样做也带来了明显的问题:在多层逐点卷积堆叠时,模型的信息流被分割在各个组内,组与组之间没有信息交换。这将可能影响到模型的表示能力和识别精度。因此,在使用分组逐点卷积的同时,需要引入组间信息交换的机制。也就是说,对于第二层卷积而言,每个卷积核需要同时接收各组的特征作为输入,如图 1(b)所示。作者指出,通过引入通道重排(channel shuffle,见图 1(c))可以很方便地实现这一机制;并且由于通道重排操作是可导的,因此可以嵌在网络结构中实现端到端的学习。

1、               ShuffleNet网络结构

基于分组逐点卷积和通道重排操作,作者提出了全新的ShuffleNet结构单元,如图2所示。该结构继承了“残差网络”(ResNet)[3]的设计思想,在此基础上做出了一系列改进来提升模型的效率:首先,使用逐通道卷积替换原有的3x3卷积,降低卷积操作抽取空间特征的复杂度,如图2(a)所示;接着,将原先结构中前后两个1x1逐点卷积分组化,并在两层之间添加通道重排操作,进一步降低卷积运算的跨通道计算量。最终的结构单元如图2(b)所示。类似地,文中还提出了另一种结构单元(图2(c)),专门用于特征图的降采样

借助ShuffleNet结构单元,作者构建了完整的ShuffeNet网络模型。它主要由16个ShuffleNet结构单元堆叠而成,分属网络的三个阶段,每经过一个阶段特征图的空间尺寸减半,而通道数翻倍。整个模型的总计算量约为140MFLOPs。通过简单地将各层通道数进行放缩,可以得到其他任意复杂度的模型。

另外可以发现,当卷积运算的分组数越多,模型的计算量就越低;这就意味着当总计算量一定时,较大的分组数可以允许较多的通道数,作者认为这将有利于网络编码更多的信息,提升模型的识别能力

实验结果

作者通过一系列在ImageNet 2016分类数据集上的控制实验说明了ShuffleNet结构单元每个部件存在的必要性、对于其他网络结构单元的优越性。接着作者通过在MS COCO目标检测上的结果说明模型的泛化能力。最后,作者给出了在ARM计算平台上ShuffleNet实际运行时的加速效果。

·        分组化逐点卷积

作者对于计算复杂度为140MFLOPs 40MFLOPs13MFLOPsShuffleNet模型,在控制模型复杂度的同时对比了分组化逐点卷积的组数在1~8时分别对于性能的影响。从表1中可以看出,带有分组的(g>1)的网络的始终比不带分组(g=1)的网络的错误率低。作者观察到对于较小的网络(ShuffleNet0.25x),较大的分组会得到更好结果,认为更宽的通道对于小网络尤其重要。受这点启发,作者移除了网络第三阶段的两个结构单元,将节省下来的运算量用来增加网络宽度后,网络性能进一步提高。

1 组数对分类错误率的影响

·        通道重排

通道重排的目的是使得组间信息能够互相交流。在实验中,有通道重排的网络始终优于没有通道重排的网络,错误率降低0.9%~4.0%。尤其是在组数较大时(g=8),前者远远优于后者。

·        对比其他结构单元

作者使用一样的整体网络布局,在保持计算复杂度的同时将ShuffleNet结构单元分别替换为VGG-likeResNetXception-likeResNeXt中的结构单元,使用完全一样训练方法。表2中的结果显示在不同的计算复杂度下,ShuffleNet始终大大优于其他网络。

2和其他网络结构的分类错误率对比(百分制)

·        对比MobileNets和其他的一些网络结构

最近Howard et al. 提出了MobileNets [4],利用[1]里的逐通道卷积的设计移动设备上高效的网络结构。虽然ShuffleNet是为了小于150MFLOPs的模型设计的,在增大到MobileNet500~600MFLOPs量级,依然优于MobileNet。而在40MFLOPs量级,ShuffleNetMobileNet错误率低6.7%。详细结果可以从表3中得到。

3 ShuffleNetMobileNet对比

和其他一些网络结构相比,ShuffleNet也体现出很大的优势。从表4中可以看出,ShuffleNet 0.5x仅用40MFLOPs就达到了AlexNet的性能,而AlexNet的计算复杂度达到了720MFLOPs,是ShuffleNet18倍。


表4 ShuffleNet和其他网络结构计算复杂度的对比

  • MS COCO物体检测

在Faster-RCNN [5]框架下,和1.0 MobileNet-224网络复杂度可比的 ShuffleNet 2x,在600分辨率的图上的mAP达到24.5%,而MobileNet为19.8%,表明网络在检测任务上良好的泛化能力

  • 实际运行速度

最后作者在一款ARM平台上测试了网络的实际运行速度。在作者的实现里40MFLOPs的ShuffleNet对比相似精度的AlexNet实际运行速度快约13x倍。224x224输入下只需15.2毫秒便可完成一次推理,在1280x720的输入下也只需要260.1毫秒。

应用展望

很多重要的需要语义信息的计算机视觉任务,如目标检测、物体识别等,都需要一个好的“基础模型”作为特征提取器。在移动设备越发重要的今天,在其之上运行的视觉算法模型会越多、准确率要求会越来越高。无论目标检测和识别、人脸检测和识别,还是图片风格化编辑、美颜,抑或是直播用户行为分析,都离不开基础模型的支持。好的基础模型可以让因为原始运算力需求过大而无法在手机上高效运行的模型能高效运行,将众多不可能变为可能。

此外,其他常用的模型压缩技术,如稀疏化、网络量化等技术也可以在ShuffleNet上应用,提高存储效率和运行速度,进一步降低视觉算法和应用的落地门槛。

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

参考文献

[1] François Chollet. Xception: Deep learning with depthwise separable convolutions. arXiv:1610.02357, 2016.

[2] Saining Xie, Ross Girshick, Piotr Dollár, Zhuowen Tu, and Kaiming He. Aggregated residual transformations for deep neural networks. arXiv:1611.05431, 2016.

[3] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep residual learning for image recognition. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 770–778, 2016.

[4] Howard, Andrew G., et al. "Mobilenets: Efficient convolutional neural networks for mobile vision applications." arXiv preprint arXiv:1704.04861 (2017).

[5] Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." Advances in neural information processing systems. 2015.



http://chatgpt.dhexx.cn/article/DgFJaXt5.shtml

相关文章

ShuffleNet模型解读

原文链接::https://arxiv.org/abs/1707.01083 Abstract 论文提出了一种计算效率极高的卷积神经网络结构——ShuffleNet,它是专门为计算能力有限的移动平台设计的。这个新结构用来两个新操作——逐渐群卷积(pointwise group convulution)和通…

ShuffleNet

ShuffleNetV2 的构建模块。首先,卷积步长为 1 的瓶颈块中,先将输入特征按通道一分为二,化成两个分支来 代替原先的分组卷积结构,并且每个分支中的卷积层都 是保持输入输出通道数相同。其中一个分支不采取任何操作以减少参数量和计…

轻量级网络——ShuffleNetV2

文章目录 1.ShuffleNetV2的介绍2.ShuffleNetV2的四条实用指南G1) Equal channel width minimizes memory access cost (MAC)G2) Excessive group convolution increases MACG3) Network fragmentation reduces degree of parallelismG4) Element-wise operations are non-negli…

轻量化网络结构——ShuffleNet

论文:《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》—Face 1.shuffle具体来说是channel shuffle,是将各部分的feature map的channel进行有序的打乱,构成新的feature map,以解决group…

【论文阅读】ShuffleNet——ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

文章目录 论文阅读代码实现modeltrainpredict 实验结果 论文阅读 感谢P导 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices 文章中提出了一个非常有效的Architecture——ShuffleNet,主要使用两种操作,分组PW卷积…

ShuffleNet V1、V2 EfficientNet 迁移学习

一、ShuffleNet V1 ShuffleNet Unit中全是GConv和DWConv。 在左侧的网络结构中,对于输入特征矩阵,有串行的GConv1和GConv2,对于普通的组卷积的计算,只针对该组内的channel的信息进行计算。组卷积虽然能够减少参数和计算量&#xf…

论文阅读笔记:ShuffleNet

1. 背景 由于深度学习模型结构越来越复杂,参数量也越来越大,需要大量的算力去做模型的训练和推理。然而随着移动设备的普及,将深度学习模型部署于计算资源有限基于ARM的移动设备成为了研究的热点。 ShuffleNet[1]是一种专门为计算资源有限的…

轻量级神经网络——shuffleNet

文章目录 轻量级神经网络——shuffleNetshuffleNet1逐点分组卷积(Pointwise group convolution)✨✨✨通道重排(channel shuffle)✨✨✨shuffleNet Unit✨✨✨shuffleNet1的网络结果和效果 轻量级神经网络——shuffleNet shuffleNet1 在之前,已经讨论过一种轻量级神…

【zynq】‘Underfined reference Xil_out 32’报错解决方法

在zynq book Exercise 4A实验中,按照文档流程会报错‘Underfined reference Xil_out 32’。没有找到#include "xil_io.h"。无法直接在”led_controller.h”中加入”xil_io.h”。 可以在"xparameters.h"加入#include“xil_io.h”解决。 插入后l…

vivado SDK Underfined reference Xil_out 32’。

在黑金ZYNQ 实验中,按照文档流程会报错‘Underfined reference Xil_out 32’。 如下图所示,网上提示是没有xil_io.h 解决办法 在文件中添加#include "xil_io.h"即可解决这个问题。

xil_printf打印遇到的问题

xil_printf打印遇到的问题 使用xil_printf打印遇到的问题解决方法 使用xil_printf打印遇到的问题 最近在使用vitis做zynq的开发。 在使用xil_printf函数的时候发现打印会出现一些问题: 使用xil_printf函数打印“%f”时,没有打印出来数据, x…

第九节,ZYNQ的双核启动

ZYNQ的双核启动 1 双核运行原理 ZYNQ是一种主从关系的AMP架构,通过松散耦合共享资源,允许两个处理器同时运行自己的操作系统或者裸机应用程序,在各自运行自己的程序或者系统的时候,可以通过共享内存进行双核之间的交互。双核启动…

ZYNQ基本使用(4) 中断 -- 私有定时器中断

目录 中断 中断简介 私有、共享和软中断 通用中断控制器GIC 复位和时钟 模块图 CPU中断信号直通 功能说明 软件生成的中断 SGI CPU私有外设中断PPI 共享外围中断SPI 硬件系统 软件系统 私有定时器中断 函数API 参考 中断 中断简介 UG585 CH7 Interrupts 以下…

Zynq-PS-SDK(4) 之 GIC 配置

目录 1、Configuration 2、GIC SDK Architecture 2.1、Structures 2.1.1、GIC interrupt vector table 2.1.2、GIC info 2.1.3、GIC 2.2、Functions 2.2.1、Basic 2.2.2、APIs 2.3、Configure flow 2.3.1、XScuGic_LookupConfig 2.3.2、XScuGic_CfgInitialize 2.3…

Xilinx软件开发:FreeRTOS快速入门

目录 第一章. 测试环境和软件版本 第二章. 创建hello world 第三章. 创建FreeRTOS2 第四章. 增加两个任务 1. 增加任务 2. 增加计数 第五章. 发送增加延时 第六章. 接收增加消息判断 第七章. 创建两个生产者 第八章. 注意事项 1. …

关于xilinx vitis 中的报错“fatal error: xil_printf.h: No such file or directory helloworld.c“问题解决

问题源:此问题是由于在VIVADO中使用了自动有AXI—IP造成的; 分析:在自定义了AXI-IP之后,会在自定义IP文件夹下生成“makefile”文件,该文件用于在vitis中生成对应文件的,所以需要修改你自定义IP的文件下的…

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf

Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf 前提条件:步骤: ** Vivado2019.1 ZYNQ7020无Uart SDK调试打印调试信息xil_printf ** 前提条件: Vivado 2019.1已…

ZYNQ开发中SDK输出串口选择以及打印函数print、printf、xil_printf的差别

ZYNQ开发系列——SDK输出串口选择以及打印函数print、printf、xil_printf的差别 前言两个串口到底是谁在打印?print 和 printf 和 xil_printf 前言 在最初的helloworld工程中,我们实现了通过串口每个1秒钟打印一次Hello World。 这里我们就来搞清楚以下…

Xilinx SDK Xil_In 内存对齐

SDK 的"xil_io.h"中提供了对地址的直接读写操作 不过我在实践中发现,对于Xil_In32(),当偏移为1不断读取时,会出现不正确的值。 我当时是在某连续若干地址中写了 0x0000 00ff(假如基址是0xc000 0000吧),但是读取的时候 0xc000 0001 读取的值是 0x0000 00ff; …

对Xil_Out32未定义的引用

第一次在HLS中遇见一个官方库函数未定义问题,这就把解决方法记录下来。 在创建好工程,写完工程代码后,发现报错如下 ./src/led_controller_test_tut_4A.o:在函数‘main’中:/home/greedyhao/Projects/LearningAndWor…