shuffleNet v2

论文名称:ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

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

目前,CNN网络在图像识别领域大放异彩,从最初的AlexNet到后面的GoogLeNet,ResNet,识别精度越来越高,但是除了精度之外,模型的计算复杂度也越来越引起大家的思考,如何降低网络的复杂度,以使网络可以高效的运行在诸如手机等移动端设备,也得到了众多研究者的研究。本文便主要在这方面发力,提出了提高网络速度设计的4个准则,并基于此设计了shuffleNet v2,在速度、精度均超过了目前的主流轻量级网络(shuffleNet v1, mobileNet v2等),本文是Face++提出,发表于ECCV2018.

下面详细介绍一下这篇文章

作者在开篇首先指出,目前评价一个网络的复杂度的指标往往是FLOPs( FLOPs简单解释就是网络执行了多少的multiply-adds操作),但是这种评价指标往往是不正确的,因为FLOPs可能不能反映出网络模型的执行速度或者时延,如下图所示:

通过观察可以发现图中(c,d)可以发现,具有相似的FLOPs的网络,执行的速度却不一样。

那么,为什么会出现这个矛盾呢?作者解释有两个原因:

  • 一些严重影响速度的因素没有考虑在FLOPs中。比如MAC(memory access cost内存访问成本,计算机在进行计算时候要加载到cache,然后计算,这是需要时间的)。比如分组卷积(group convolution)就会消耗较大的MAC。并行度,如果网络的并行度较高,那么速度就会有显著的提升。
  • 计算平台的不同,比如tensor运行的使用会提高计算速度,(但是最近发现,即使通过分解(decomposition)可以减少75%的FLOPs,但是计算速度却便慢了,究其原因是因为最近更新的cudnn加强了对3*3conv计算的优化,3*3卷积并不是1*1卷积计算速度的9倍这么简单)

基于以上的分析,作者提出了2个需要考虑的网络执行效率对比的设计准则:

  • 使用正确的速度度量方式,代替FLOPs
  • 要在目标计算平台上计算,不然结果不具有代表性。

如下这张图是作者分别在GPU(1080ti, cudnn7.0)以及ARM(高通骁龙810)环境下的网络运行时间展示,可以发现,除了卷积部分,还有很大部分时间在做其他的事情,这也说明,仅仅使用FLOPs是不够的。并且从该图可可以看出ARM相比较于GPU确实慢了一些,假设读取数据时间一致,GPU中卷积操作只占到将近一半,而ARM中已经占到了约90%。

基于此,作者做了如下的分析?

G1:输入输出具有相同channel的时候,内存消耗是最小的

为什么这么说:

由于目前主流网络均使用的depthwise separable convolutions,其中pointwise convolution占据了很大一块的运算量,这个在shuffleNet V1中有说明详细参见博客:shuffleNet V1,作者以1*1网络为例,假设feature map的大小为h*w输入输出channel分别为c1和c2,那么:

FLOPs:

B=hw(c111c2)=hwc1c2 B = h w ( c 1 ∗ 1 ∗ 1 ∗ c 2 ) = h w c 1 c 2

MAC:
MAC=hw(c1+c2</
### ShuffleNet V2 架构详解 #### 设计原则 ShuffleNet V2 的设计基于四个黄金准则,这些准则是通过大量实验得出的最佳实践[^1]: - **平衡计算量和内存访问成本 (MAC)**:实际运行时间不仅取决于 FLOPs 计算开销,还受到 MAC 影响。 - **最小化逐点卷积的数量**:减少 pointwise 卷积的比例有助于提升效率。 - **避免过多的网络碎片化**:增加分支数量会降低计算效率。 - **元素级操作不可忽视**:element-wise 操作虽然简单,但在深层网络中累积影响显著。 #### 主要改进点 相比 ShuffleNet V1,V2 版本做了如下重要改动: - 取消残差连接中的 shortcut path 上的 1×1 卷积层; - 将 channel shuffle 放置在每个基本模块结束处而非开始位置; - 去掉了 group convolution 中不必要的 ReLU 层; ```python class BasicUnit(nn.Module): def __init__(self, inp, oup, stride): super(BasicUnit, self).__init__() branch_main = [ nn.Conv2d(inp//2, inp//2, kernel_size=1), nn.BatchNorm2d(inp//2), nn.ReLU(inplace=True), nn.Conv2d(inp//2, inp//2, kernel_size=3, padding=1, groups=inp//2, stride=stride), nn.BatchNorm2d(inp//2), nn.Conv2d(inp//2, oup-inp//2, kernel_size=1), nn.BatchNorm2d(oup-inp//2), nn.ReLU(inplace=True) ] ``` #### 应用场景 由于其高效的特性,ShuffleNet V2 广泛应用于移动端设备上的实时图像处理任务,如: - 实时物体检测 - 图像分类 - 移动端视觉识别服务 该模型特别适合资源受限环境下的高性能需求应用开发[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值