GhostNet的不完全解析

CVPR2020 & IJCV2022(the extended version)
Noah’s Ark Lab, Huawei Technologies

论文地址: https://arxiv.org/abs/1911.11907
源码:https://github.com/huawei-noah/ghostnet.

摘要

由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络(CNNs)是很困难的。特征图中的冗余性是这些成功cnn的一个重要特征,但在神经结构设计中很少被研究。
本文提出了一种新的ghost模块,从廉价的操作中生成更多的特征映射。基于一组内在特征映射,应用一系列成本低廉的线性变换来生成许多幽灵特征映射,可以充分揭示内在特征背后的信息。
提出的ghost模块可以作为即插即用组件来升级现有的卷积神经网络。 Ghost bottlenecks被设计为堆栈的ghost模块,可以很容易地建立轻量级的GhostNet。
在基准测试上进行的实验表明,所提出的Ghost模块是baseline模型中卷积层的一个令人印象深刻的替代方案,我们GhostNet可以在ImageNet ILSVRC-2012分类数据集上以相近的计算成本比MobileNetV3获得更高的识别性能(例如75.7%的top-1精度)。

研究动机

在主流的深度神经网络提取的特征图中,丰富甚至冗余的信息通常保证了对输入数据的全面理解。例如,图1展示了由ResNet-50生成的输入图像的一些特征图,并且存在许多相似的特征图对,就像彼此之间的幽灵一样。

特征图中的冗余(ghost maps)可能是一个成功的深度神经网络的一个重要特征。我们不是避免冗余的特征映射,而是倾向于接受它们,但以一种低成本高效益的方式。

相关工作

目前流行的轻量方法:

模型压缩(性能通常取决于给定的预训练模型)

  1. pruning connection: 连接剪枝,剪掉一些不重要的神经元连接
  2. channel pruning: 通道剪枝,剪掉一些无用的通道
  3. model quantization: 模型量化,在具有离散值的神经网络中对权重或激活函数进行压缩和计算加速
  4. tensor decomposition: 张量分解,通过利用权重的冗余性和低秩性来减少参数或计算
  5. knowledge distillation: 知识蒸馏, 利用大模型教小模型,提高小模型的性能

紧凑模型设计(虽然这些模型在很少的FLOPs下获得了良好的性能,但特征映射之间的相关性和冗余性并未得到很好的利用。)

  1. Xception: depthwise conv operation
  2. MobileNet v1-v3: depthwise separable conv、 inverted residual block、AutoML technology
  3. ShuffleNet v1-v2: channel shuffle operation、channel split

网络设计

Ghost module

- 由普通卷积生成不含冗余的特征图1;
- 由特征图1通过identity和廉价的线性运算Φ生成完整特征图(Φ 是诸如3x3 或 5x5的卷积,并且是逐个特征图进行深度可分离卷积)。

Ghost module的特点

  1. 与广泛使用的1×1pointwise convolution的单元相比,Ghost module中的主要卷积可以自定义内核大小;
  2. 现有的方法]采用pointwise convolution来跨通道处理特征,然后采用 depthwise convolution来处理空间信息。而Ghost模块则采用普通的卷积方法,首先生成一些内在的特征映射,然后利用廉价的线性操作来增强特征,增加信道;
  3. 在以往的高效架构中,处理每个特征映射的操作仅限于 depthwise convolution or shift operation,而在Ghost模块中的线性操作可以有很大的多样性(文中的线性操作指深度可分离卷积操作);
  4. 将identity与Ghost module中的线性变换并行,以保持与普通卷积输出一致的内在特征图。

复杂度分析

FLOPs(floating point operations):用来衡量算法/模型的复杂度。 FLOPs = Cout∗Hout∗Wout∗Cin∗K∗K

假设有1个identity和s-1个ghost特征图(1个特征图有s-1个冗余),则FLOPs减少s倍:

分子为普通卷积的复杂度;分母为ghost module的复杂度,红色下划线是普通卷积产生的FLOPs(第一步),蓝色下划线是identity和线性运算产生的FLOPs(第二步)。
其中,s代表每个通道产生的总映射(1个intrinsic feature map和s-1个ghost feature maps),c为输入特征图个数一般较大,s<<c; n/s指经过普通卷积输出的intrinsic feature map;d×d为线性操作的平均核大小,具有与k×k相似的大小。

Ghost Bottlenecks


类似于ResNet残差块的设计,代码中identity中有一个深度可分离卷积操作。第一个ghost module作为expansion layer,用于增加通道数目,(输出c/ 输入c) 称为expansion ratio;第二个ghost module用于减少通道数目,使其与输入通道数匹配,进行shortcut。
根据MobileNetV2建议:第二个ghost module之后不再使用ReLU,在每层之后应用BN。

GhostNet

由ghost module堆叠而成,G-bneckt表示Ghost Bottleneck。#exp表示expansion size。#out表示输出通道数。SE表示是否使用SE模块。
与MobileNetV3相比,由于其延迟较大,我们不使用hard-swish非线性激活函数。

Experiments





目标检测:

超级详细易懂的GhostNet解析相关推荐

  1. caffe源码深入学习6:超级详细的im2col绘图解析,分析caffe卷积操作的底层实现

       在先前的两篇博客中,笔者详细解析了caffe卷积层的定义与实现,可是在conv_layer.cpp与base_conv_layer.cpp中,卷积操作的实现仍然被隐藏,通过im2col_cpu函 ...

  2. android基础 [超级详细android Activity组件解析(Activity综述,Activity生命周期,Activity启动--携带参数启动)]

    1 章节目录 2 Android Activity综述 2.1 Activity怎么用 2.2 layout - 界面布局 2.3 Java - 控制界面 2.4 AndroidManifest.xm ...

  3. MySQL约束那些事(超级详细,附带代码解析)

    约束 1.约束概述 1.1 为什么需要约束 数据完整性是指数据的精确性和可靠性.它是防止数据库中存在不符合语义规定的数据和防止错误信息的输入输出造成无效操作或错误信息而提出的. 为了保证数据的完整性, ...

  4. echo命令详细解析(linux中超级详细,图文展示)

    echo命令详细解析(linux中超级详细,图文展示) echo作为最基本,最常用的命令,在初学linux,或运维操作中,有着广泛性的使用:特别是在写shell脚本的时候,更是会经常性的用到. 虽然e ...

  5. 超级详细解析——字模

    超级详细解析--字模 一.简介 汉字库: 即存储汉字的仓库.现在常使用的汉字库有 HZK16.HZK24.HZK32...即对应的16*16.24*24.32*32汉字点阵字库.16X16点阵方式是最 ...

  6. 超级详细备注的代码:Python帮助您高效通过英语六级考试

    超级详细备注的代码:Python帮助您高效通过各种英语考试 标题:限时免费|领取大学英语六级考试葵花宝典 联系小编,获取源码和30份六级真题. # -*- coding:utf-8 -*-#作者:公众 ...

  7. 网络管理:超级详细Tcpdump 的用法

    第一种是关于类型的要害字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一 ...

  8. 超级详细配置SSM (Intellij idea + Maven + Spring + SpringMVC + MyBatis + c3p0 )

    时间2018/12/31,使用的包都是最新的和用的人最多的QAQ. Maven仓库查找包的地址 https://mvnrepository.com/ 在经历了70多个小时的奋斗后(花了60个小时学习了 ...

  9. Oracle GoldenGate(OGG)- 超级详细

    1. OGG简介 OGG 是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化(数据量只有日志的四分之一左右) OGG 能够实现大量交易数据的实时捕捉,变换和投 ...

最新文章

  1. 汽车票销售系统mysql,jsp683客运汽车票网上售票系统mysql
  2. oracle 删除旧数据,Oracle 删除海量数据下避免Ora-01555快照过旧错误的执行脚本
  3. GIS影像数据集初步学习
  4. RedHat6配置网络yum源
  5. Tomcat的Session管理(三)
  6. 编辑器eslint格式_vscode保存代码,自动按照eslint规范格式化代码设置
  7. javascript 西瓜一期 11 二进制的数数进位解析
  8. C#仿QQ皮肤—更新DataGridView的鼠标跟随效果
  9. Github使用技巧
  10. 使用Redis+java(模仿数据库)实现对象存取和读取
  11. Spring静态资源解决方案
  12. svn服务端及客户端搭建和使用(一)
  13. JXTA——JAVA P2P网络编程技术(入门篇)
  14. 转载:机器人工程师学习计划(YY硕)
  15. 怎么访问vmware虚拟机IIS网站
  16. C++后台开发面试题总结(涉及C++基础、多线程多进程、网络编程等)
  17. iOS-高德地图API的定位与搜索功能
  18. 单相电、三相电的功率计算方法
  19. 树莓派基础实验24:超声波测距传感器实验
  20. GprMax2D ——英国建筑研究机构(BRE)示例 #2

热门文章

  1. 交换机学习之划VLAN
  2. 计算机网络基础【1】
  3. linux查看cpupower模式,cpupower命令 – 调整CPU主频
  4. 《猩球崛起2:黎明之战》之《汉武大帝》贰师将军
  5. 分布式系统原理与设计
  6. 汽车金融的上半年:易鑫巨亏超10亿 灿谷逾期率同比大幅飙升
  7. linux命令 清空文件夹,linux清空文件夹命令问题
  8. Delphi_调用DLL方法[创建对象下面的方法]
  9. 华秦科技通过注册:拟募资12.8亿 预计年营收超5亿
  10. Google 东京奥运会 Doodle