shuffleNetV2

ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

Why

ResNet,DenseNet等网络已经把分类问题的精度推到一个很高的水平,而很多轻量级网络MobleNet, XceptionNet和ShuffleNet则在不牺牲太多精度的前提下,降低网络计算量,令深度学习网络可以运行在一些资源受限的平台上,比如ARM,FPGA。本文发现轻量级网络设计的指标FLOPs只能间接的描述网络复杂度,因为网路运行速度除了和浮点操作多少外,还和内存访问(MAC)和指令可并行度有关系,本文建议使用这些直接描述性能的指标指导轻量级网络的设计,另外要在多个平台下测试网络性能。下图是shuffleNetV2和其他几个轻量级网络在GPU和ARM两个平台上的对比,speed-accuracy都是state-of-art了
speed-accuracy

How

文中提出设计网络的四个指导原则

  1. 卷积层的输入通道数和输出通道数一致时,MAC最小,有利于提高速度
    G1

  2. 分组卷积不利于速度提升,卷积分组不易过大
    G2

  3. 网络分支/多个卷积穿行不利于并行化
    G3

  4. element-wise操作虽然FLOP很小,但是MAC很大,不利于速度提升
    element-wise包括Add/Relu/ResNet的short-cut等
    G4

最终基于shuffleNet,遵守上述四个原则设计了shuffleNetV2,以下是Block building
buildBlock

  • element-wise操作被channel-split和concat替换
  • 分组卷积GConv被取消(也是因为有了channel-split)
  • depthwise convolution保留

shuffleNetV2网络结构
shuffleNetV2

### ShuffleNetV2 算法原理 ShuffleNetV2 是一种轻量级卷积神经网络架构,旨在解决移动设备上的高效图像分类问题。该模型通过引入几个核心组件来优化计算效率和提升性能: - **通道洗牌 (Channel Shuffling)**:这是 ShuffleNetV2 的核心技术之一,用于打破特征图之间因分组卷积而产生的独立性,从而增强不同通道间的交互作用并改善信息流[^1]。 - **逐点分组卷积 (Pointwise Group Convolutions)**:为了减少参数数目以及降低运算复杂度,ShuffleNetV2 利用了这种特殊的卷积形式,在保持较高精度的同时显著减少了所需的浮点数乘加次数。 - **恒等残差连接 (Identity Residual Connections)**:类似于经典的 ResNet 结构中的跳跃链接机制,这些连接有助于缓解深层网络训练过程中的梯度消失现象,并促进更有效的反向传播路径形成。 ### 实现方式 具体到实现层面,ShuffleNetV2 主要遵循如下流程来进行构建与部署: 1. 对输入数据执行 `channel_shuffle` 操作以重新排列各层输出的通道顺序; 2. 应用 `group_conv` 来替代标准卷积操作,以此达到降维目的; 3. 进行复合缩放处理——即调整网络结构中深度、宽度及分辨率三个维度的比例因子,使得整体规模适应特定硬件资源约束条件下的最优配置需求[^2]; 4. 组合以上要素搭建完整的 ShuffleNetV2 架构,并针对目标识别任务微调超参直至获得满意的结果。 以下是 Python 中定义的一个简化版 ShuffleNetV2 卷积模块的例子: ```python import torch.nn as nn class ShuffleUnit(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super(ShuffleUnit, self).__init__() # 定义基本组成部分 self.conv1 = nn.Conv2d(in_channels=in_channels, out_channels=out_channels//4, kernel_size=1) self.bn1 = nn.BatchNorm2d(out_channels//4) self.depthwise_conv = nn.Conv2d( in_channels=out_channels//4, out_channels=out_channels//4, groups=out_channels//4, kernel_size=3, padding=1, stride=stride ) self.bn2 = nn.BatchNorm2d(out_channels//4) self.conv2 = nn.Conv2d(in_channels=out_channels//4, out_channels=out_channels, kernel_size=1) self.bn3 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) def forward(self, x): residual = x output = self.conv1(x) output = self.bn1(output) output = self.relu(output) output = self.depthwise_conv(output) output = self.bn2(output) output = self.conv2(output) output = self.bn3(output) if hasattr(self, 'downsample'): residual = self.downsample(residual) return self.relu(residual + output) ``` ### 应用场景 由于其高效的特性,ShuffleNetV2 广泛应用于各种移动端视觉应用领域内,特别是在那些对实时性和功耗敏感的任务上表现出色。例如但不限于: - 移动端图片分类服务; - 手机摄像头内置的人脸检测功能; - AR/VR 设备中的环境感知算法支持; - 物联网边缘节点处的小型物体追踪系统开发等场合均可见到此框架的身影[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值