ShuffleNet系列论文阅读笔记(ShuffleNetV1和ShuffleNetV2)

news2024/11/25 6:43:16

目录

    • ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
      • 摘要
      • Approach—方法
        • Channel Shuffle for Group Convolutions—用于分组卷积的通道重排
        • ShuffleNet Unit—ShuffleNet单元
        • Network Architecture—网络体系结构
      • 总结
    • ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
      • 摘要
      • Introduction—简介
      • 四条准则
      • Practical Guidelines for Efficient Network Design—高效网络设计的实用准则
        • G1) Equal channel width minimizes memory access cost (MAC) -- 相同通道宽度能够最小化MAC(内存访问成本)
        • G2) Excessive group convolution increases MAC—过度的组卷积会增加 MAC
        • G3) Network fragmentation reduces degree of parallelism—网络碎片化会降低并行程度
        • G4) Element-wise operations are non-negligible—Element-wise操作的影响不可忽略
      • ShuffleNet V2: an Efficient Architecture—一个高效的架构
        • 基本单元
        • ShuffleNet V2 的整体架构
      • Analysis of Network Accuracy—网络精度分析
      • 总结

ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

论文链接:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices

摘要

(1)CNN架构ShuffleNet是专门为计算能力有限的移动设备而设计

(2)ShuffleNet利用两种新的运算方法:

  • 分组逐点(1 × 1)卷积(pointwise group convolution)
  • 通道重排(channel shuffle)

作用:

(1)使用分组逐点卷积来降低1×1卷积的计算复杂度

(2)使用通道重排操作来帮助信息在特征通道间流动

Approach—方法

Channel Shuffle for Group Convolutions—用于分组卷积的通道重排

下图是分组卷积的图示,可以看到分组卷积参数量大大减少,计算量同样也会减少。

image-20240618165624543

本文中的pointwise group convolution其实就是用1 × 1的卷积核进行分组卷积,进一步降低计算复杂度。

优点:通过确保每个卷积仅在相应的输入通道组上运行,组卷积降低了计算成本。

但是分组卷积的副作用:阻塞通道之间的信息并削弱表征能力。

如下图所示,沿着channel分成红、绿、蓝三组,各组之间的信息是不流通的,只能融合组内的信息。

image-20240618170838959

解决方法

本文采用channel shuffle操作,通过将每个分组后的通道再分成几组子通道,并将不同分组中的不同子通道进行混合(洗牌操作),那么就可以保证不同分组间的特征通道的特征信息可以共享。

channel shuffle的作用: 跨通道信息交融。

下图中,(b) 第二个分组卷积是从第一个分组卷积里不同的组里拿数据(b是一种思想);(c) 利用通道重排产生与(b) 等效的实现(c是一种实现)

image-20240618171133024

channel shuffle通道重排过程

(c)的实现: 假设卷积层有g组,输出有g × n个通道,先将输出通道维数reshape为(g,n)的矩阵,再进行转置(transpose),展平(flatten),作为下一层的输入(即使两个卷积的组数不同,操作依然有效)

该过程可以直接调用pytorch的API实现,是可微分、可导的,计算效率很高,几乎没有额外的算力消耗,可以进行端到端的训练。

image-20240618171711349

ShuffleNet Unit—ShuffleNet单元

ShuffleNet Unit是基于Resdual block改进得到的

image-20240618172243684

(a)为一个Resdual block

①1×1卷积(降维)+3×3深度卷积+1×1卷积(升维)
②之间有BN和ReLU
③最后通过add相加

(b)为输入输出特征图大小不变的ShuffleNet Unit

①将第一个用于降低通道数的1×1卷积改为1×1分组卷积 + Channel Shuffle
②去掉原3×3深度卷积后的ReLU
③ 将第二个用于扩增通道数的1×1卷积改为1×1分组卷积

(c)为输出特征图大小为输入特征图大小一半的ShuffleNet Unit(下次阿阳模块)

①将第一个用于降低通道数的1×1卷积改为1×1分组卷积 + Channel Shuffle
②令原3×3深度卷积的步长stride=2, 并且去掉深度卷积后的ReLU
③将第二个用于扩增通道数的1×1卷积改为1×1分组卷积
④shortcut上添加一个3×3平均池化层(stride=2)用于匹配特征图大小
⑤对于块的输出,将原来的add方式改为concat方式(通道加倍)

Q1:为什么在模块输出部分的逐点分组卷积后并没有使用channel shuffle?

因为此时得到的结果已经相当不错了,所以不需要进行通道重排了

Q2:为什么去掉第二个ReLU?

这个我们在MobileNetV2(点这里)里介绍过,作者发现训练过程中depthwise部分得到卷积核会废掉,认为造成这样的原因是由于ReLU函数造成的。

Q3:为什么用concat代替add?

扩大通道尺寸,无需额外计算成本

Network Architecture—网络体系结构

不同分组数的shuffleNet网络结构如下图:

(1)首先使用的普通的3 x 3的卷积和max pool层

(2)接着分为三个阶段:

​ 每个stage都是重复堆叠了几个ShuffleNet unit

​ 对于每个stage,第一个unit采用的是stride = 2,这样特征图width和height各降低一半,而通道数增加一倍

​ 后面的都是stride=1,特征图和通道数都保持不变

(3)对于基本单元来说,其中瓶颈层,就是3 x 3卷积层的通道数为输出通道数的1/4,这和残差单元的设计理念是一样的

同时从下图可以看出,并非分组数越多,运算量越小(g = 4 ) < ( g = 8 )

image-20240618172741331

总结

通过group pointwise convolution分组1 x 1卷积和channel shuffle通道重排操作,降低参数量和计算量,扩增卷积核个数。


ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

论文链接:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

摘要

神经网络架构的设计目前主要由计算复杂度的间接指标(即 FLOPs)来指导。

但是,直接指标(如速度)还依赖于其他因素。

本文主要工作

(1)提出了新的网络结构ShuffleNet V2

(2)指出过去在网络架构设计上仅注重间接指标 FLOPs 的不足,并提出两个基本原则和四个实用准则来指导网络架构设计

Introduction—简介

FLOPs作为衡量指标的不足,FLOPs是一个间接的指标。

直接指标是指速度或延迟

image-20240618185056109

四个网络架构在两个硬件平台、四种不同计算复杂度上的(验证集 ImageNet 分类)精度、速度和 FLOPs 结果。

从©和(d)可以看出,具有相似FLOPs的网络却具有不同的速度,在GPU上相同的FLOPs速度差异很大,在CPU上却很小。因此,使用FLOPs作为计算复杂度的唯一指标是不够的,可能会导致次优化设计。

FLOPS和FLOPs:

​ FLOPS: 全大写,指每秒浮点运算次数,可以理解为计算的速度,是衡量硬件性能的一个指标 (硬件)
​ FLOPs: s小写,指浮点运算数,理解为计算量,可以用来衡量算法/模型的复杂度,(模型)在论文中常用GFLOPs(1 GFLOPs = 10^9FLOPs)

下图反映了不同的轻量化模型在不同的硬件设备上的计算开销分布

element wise(逐元素操作):relu()函数激活,残差网络的连接(add)等

Data:数据的输入输出

如果只优化FLOPs(对应加法乘法运算),相当于只优化卷积运算,从图中可以看出还有很多其他的操作的开销也很大,特别是在GPU上。

image-20240618185117250

从上图可以得出以下的结论:

1.乘-加浮点运算次数FLOPs仅反映卷积层,仅为间接指标

2.不同硬件上的测试结果不同

3.数据读写的内存MAC占用影响很大

4.Element-wise逐元素操作带来的开销不可忽略

间接指标和直接指标差异的原因

(1)对速度有较大影响的几个重要因素对 FLOPs 不产生太大作用。

(2)由于平台的不同是,使用相同的FLOPs操作可能有不同的运行时间。

ShuffleNetv2提出的两个原则

第一,应该用直接指标(例如速度)替换间接指标(例如 FLOPs)。
第二,这些指标应该在目标平台上进行评估。

四条准则

准则一︰输入输出通道数相同时,内存访问量MAC最小

准则二︰分组数过大的分组卷积会增加MAC

准则三︰碎片化操作对并行加速不友好

准则四:逐元素噪作(Element-wise)带来的内存和耗时不可忽略

Practical Guidelines for Efficient Network Design—高效网络设计的实用准则

G1) Equal channel width minimizes memory access cost (MAC) – 相同通道宽度能够最小化MAC(内存访问成本)

1 × 1卷积其实是轻量化网络里面计算量最大,参数量最多,计算最密集的部分,特别是使用了深度可分离卷积之后。

1×1卷积核的参数由两个量决定:

  • 1.输入通道数C1
  • 2.输出通道数C2

假设一个1×1卷积层的输入特征通道数是c1,输出特征尺寸是h和w,输出特征通道数是c2,那么这样一个1×1卷积层的FLOPs就是下面式子所示 :

image-20240618230228907

(更具体的写法是B=1×1×c1×c2×h×w,这里省略了1×1)

假设计算设备的内存足够大能够储存整个计算图和参数,那么:

image-20240618230248711

image-20240618230418390

由中值不等式得:
image-20240619143017918

因此理论上MAC的下界由FLOPs决定,当且仅当C1 = C2 时取得最小值。

G2) Excessive group convolution increases MAC—过度的组卷积会增加 MAC

组卷积是ResNext提出的结构,使用了稀疏的平行拓扑结构来减少计算复杂度:

image-20240619115629417

作者发现,虽然使用组卷积在相同计算复杂度的情况下拓展了通道数,但是通道数的增加也使得MAC大大增加。

假设 g 是1x1组卷积的组数,则有:

image-20240619115827281

将FLOPs,也就是B代入下式中:

image-20240619120142539

即:

image-20240619120215325

B和MAC其实是耦合的,所以在比较的情况下一般控制B不变进行比较。

可以看到,对于固定的输入大小 (h,w,ci) 和计算复杂度FLOPS (B),MAC随着 g 的增大而增加

因此虽然提高g可以降低参数量、计算量降低,但是副作用就是MAC增大,MAC增大速度就会降低。因此要在速度和精度之间进行平衡。

下图是实验结果,g是分组数,可以看出组数越大速度越慢,特别是对于GPU而言。

image-20240619120833044

G3) Network fragmentation reduces degree of parallelism—网络碎片化会降低并行程度

碎片化操作:多分支、多通路,把网络变得很宽。

网络碎片化,减低模型的并行度,相应速度会慢。

GoogleNet系列就大量使用的Inception这样的multi-path结构(即存在一个lock中很多不同的小卷积或者pooling)增加了准确度:

image-20240619121340400

下图为实验结果FLOPs固定,网络越碎片化,推理速度越慢,特别是对GPU并行运算设备(红框和红框比,黄框和黄框比)和小型网络(蓝色框参数表示网络大小)。

image-20240619121552667

G4) Element-wise operations are non-negligible—Element-wise操作的影响不可忽略

这里实验发现如果将ResNet中残差单元中的ReLU和shortcut移除的话(最后一行),速度有20%的提升。单独移除也能提升速度(蓝色框内)。

image-20240619121923877

ShuffleNet V2: an Efficient Architecture—一个高效的架构

基本单元

(a)和(b)ShuffleNet V1的基本单元(主要构成pointwise group convolution和channel shuffle)。

不足之处(有待商榷)

大量使用了1×1卷积,使用了分组卷积。—— 违背了 G2
采用了类似ResNet中的瓶颈层(bottleneck layer),输入和输出通道数不同(升维再降维)。—— 违背了 G1
使用太多分组。—— 违背了 G3
短路连接中存在大量的元素级Add运算。—— 违背了G4

image-20240619122309423

©和(d)ShuffleNet V2的基本单元

©单元:ShuffleNet V2 的基本单元

(1)增加了Channel Split操作,实际上就是把输入通道分为2个部分,一半通道走左边分支,一半通道走右边分支。

(2)根据G1: 左边分支做恒等映射,右边的分支包含3个连续的卷积(有一个深度可分离卷积),并且输入和输出通道相同,每个分支中的卷积层的输入输出通道数都一致。

(3)根据G2: 两个1x1卷积不再是组卷积。

(4)根据G3: 减少基本单元数。因此有一个分支不做任何操作,直接做恒等映射。

(5)根据G4: 两个分支的输出不再是Add元素,而是concat在一起,紧接着是对两个分支concat结果进行channel shuffle,以保证两个分支信息交流。

完全满足G1和G2(恒等映射,输入输出通道一致;没用分组卷积),G3、G4(两个分支基本满足;ReLu函数的Element-wise操作不可避免)

注意: 右边分支最后那个1×1卷积后面是跟了BN以及ReLU的,这与v1先Add再ReLU不同。

(d)单元:用于空间下采样 (2×) 的 ShuffleNet V2 单元

对于下采样模块,不再有channel split,每个分支都有stride=2的下采样,最后concat在一起后,特征图空间大小减半,但是通道数翻倍。

注意:©和(d)单元都是在concat后再进行channel shuffle,以此保证通道间的信息交融。

ShuffleNet V2 的整体架构

v2在全局池化层之前增加了个conv5卷积,这是与v1的一个区别。

image-20240619124126399

Analysis of Network Accuracy—网络精度分析

ShuffleNet V2高效且准确率高的原因:

(1)每个构建模块非常高效,可以产生更多的通道和高强的网络;

(2)在每个模块中,一半的特征通道直接穿过该模块去了下一个模块(恒等映射),这可以被看作为某种“特征复用”,并且衰减指数为(1/2)^n。

image-20240619124549522

(a)是DenseNet论文中的图,表示第一个Dense Block中各个Dense Layer之间的权重绝对值。

​ DenseNet因为特征复用,所以性能很强大;

​ DenseNet训练出的特征复用模式,相邻的Dense Layer权重更大。

(b)是ShuffleNet V2各个Block之间通过channel split共享的复用通道数,相邻的block有更多的共享的复用特征,天然和DenseNet相似,因此性能也很强大。

总结

本文通过大量实验提出四条轻量化网络设计准则,对输入输出通道、分组卷积组数、网络碎片化程度、逐元素操作对不同硬件上的速度和内存访问量MAC的影响进行了详细分析。 提出ShuffleNet V2模型,通过Channel Split替代分组卷积,满足四条设计准则,达到了速度和精度的最优权衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1846940.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…

一个很好用的地图工具的使用:思极地图,以及vue+思极地图的使用

前言&#xff1a; 随着现在国网等一部分公司的需求&#xff0c;在线地图-思极地图 出现在我们眼前&#xff0c;给我们带来了很多便利&#xff0c;这里分享下他的信息与使用。 实现效果&#xff1a; 相关资料&#xff1a; 1、官网地址 2、在线地址 3、官方api地址 实现步骤-js…

Nvidia Isaac Sim组装机器人和添加传感器 入门教程 2024(5)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

椭圆的几何要素

椭圆的几何要素 flyfish 椭圆的方程为 x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1。 长半轴 a a a&#xff08;绿色虚线&#xff09;和短半轴 b b b&#xff08;紫色虚线&#xff09;。 焦点 F 1 ( − c , 0 ) F1(-c, 0) F1(−c,0)&#…

【C语言】解决C语言报错:Segmentation Fault

文章目录 简介什么是Segmentation FaultSegmentation Fault的常见原因如何检测和调试Segmentation Fault解决Segmentation Fault的最佳实践详细实例解析示例1&#xff1a;未初始化指针示例2&#xff1a;数组越界示例3&#xff1a;使用已释放的内存示例4&#xff1a;递归导致栈溢…

vscode安装所需插件 个人记录版

vscode安装所需插件 个人记录版 仅做参考 设置

LangChain入门学习笔记(六)—— Model I/O之Output Parsers

当大模型产生输出返回后&#xff0c;它的内容更像是一段平铺的文字没有结构。在传给下游节点处理时可能并不能符合输入要求&#xff0c;LangChain提供了一套机制使得模型返回的内容可以按照开发者定义的那样结构化。 在官网文档中可以看到LangChain提供了丰富的输出解析器&…

Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选

Solana Sol跟单机器人&#x1f916; SOL跟单机器人&#xff08;Copy Trading Bot&#xff09;是一种自动化交易工具&#xff0c;允许用户复制其他成功交易者的交易行为。这种机器人通常用于加密货币市场、外汇市场等金融市场。以下是SOL跟单机器人的一些关键特性和功能&#xf…

优维“态势感知监控”产品:像“上帝”一样掌控应用系统

什么是态势感知&#xff1f; 态势感知是一种基于环境的、动态、整体地洞悉全网安全风险的能力。它以安全大数据为基础&#xff0c;从全局视角对全网安全威胁进行发现识别、理解分析展示和响应处置&#xff0c;并预测发展趋势&#xff0c;为后续网络安全的相关决策与行动提供数据…

重学java 81.类的加载时机

不破不立&#xff0c;人类最宝贝的品质就是勇敢和过去告别 —— 24.6.21 一、类的加载时机 1.new对象 2.new子类对象(new子类对象先初始化父类) 3.执行main方法 4.调用静态成员 5.反射,创建Class对象 这五种情况就可以让类加载到内存 类加载过程 1.问题:谁将class文件加载到了…

爬虫逆向实战(41)-某花顺登陆(Cookie、MD5、SHA256)

一、数据接口分析 主页地址&#xff1a;某花顺 1、抓包 通过抓包可以发现在登陆时&#xff0c;网站首先请求了pwdRangeCalcRegular.json、getGS两个接口&#xff0c;接着请求dologinreturnjson2进行登陆&#xff0c;但是此接口会返回请先完成滑块验证码校验的响应。然后网站…

U盘容量变0字节:详解原因、恢复方案与预防措施

一、U盘容量变0字节的现象 在日常工作和学习中&#xff0c;U盘作为一种便携式存储设备&#xff0c;被广泛用于数据交换和存储。然而&#xff0c;有时我们可能会遇到一种奇怪的现象&#xff1a;原本容量正常的U盘&#xff0c;在插入电脑后突然显示容量为0字节。这种情况意味着我…

unity-调用讯飞星火语音唤醒-新版windowsSDK

调用讯飞星火语音唤醒-新版windowsSDK 先贴一张在unity中 wins系统下成功调用新版的讯飞windowsSDK的运行截图 为什么要用讯飞的语音唤醒&#xff1f; 项目中需要在unity和win系统下进行语音唤醒开启语音对话&#xff0c;而语音唤醒比较成熟的方案大多都是在linux系统下的&…

CocosCreator 微信小游戏上架流程准备工作

前言 事前准备非常重要&#xff0c;因为有creator的助力&#xff0c;实际上开发小游戏往往很快&#xff0c;但是如果准备不足&#xff0c;上架及审核过程非常慢&#xff0c;往往游戏做好了&#xff0c;还得各种排队等审核&#xff0c;大多数开发者又不是腾讯白名单之内&#x…

甘肃的千层烤馍:传统面点的魅力绽放

千层烤馍&#xff0c;作为甘肃美食文化的重要象征&#xff0c;以其独特的外形和丰富的口感&#xff0c;吸引着众多食客。它的外观犹如一件精美的艺术品&#xff0c;层层叠叠&#xff0c;金黄酥脆&#xff0c;散发着诱人的香气。 在甘肃平凉地区制作千层烤馍&#xff0c…

windows10 编译libevent2.1.12

windows10 编译libevent2.1.12 nmake 编译libevent使用vs命令行工具2.编译命令3.编译出现问题 cmake 编译libevent nmake 编译libevent 使用vs命令行工具 2.编译命令 nmake /f Makefile.nmake3.编译出现问题 cmake 编译libevent cmake -S . -B build32 -A Win32 cd build32…

NXP i.MX8系列平台开发讲解 - 3.15 Linux 之USB子系统(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 目录 Linux 之USB子系统(一) 1. USB基础简介 1.1 USB的传输模式 1.2 USB 的设备描述符 1.3 USB 类的定义分类 2…

IK分词器热刷新词库实践分享

目录 前言 什么是分词器&#xff1f; ik分词器简介 ik分词器和默认分词器的对比 ik分词器介绍 ik分词器的分词问题 自定义词库 主配置解说 通过配置文件自定义词库 Step1: 新建自定义分词库 Step2: 将我们的自定义词添加到ik的配置文件中 Step3: 重启es&#xff0c;…

DSP C6000教学实验箱操作教程_数字图像处理:5-3 图像缩放

一、实验目的 学习图像缩放的原理&#xff0c;掌握图像的读取方法&#xff0c;并实现图像缩放。 二、实验原理 图像缩放 在计算机图像处理和计算机图形学中&#xff0c;图像缩放是指对数字图像的大小进行调整的过程。图像缩放是一种非平滑的过程&#xff0c;需要在处理效率以…