本文为CVPR 2020 录用论文,作者来自华为、北京大学、悉尼大学,截止目前已有36次引用,github 星标1.2K,是近年来值得关注的轻量级CNN模型。

使用轻量操作代替部分传统卷积层生成冗余特征以减少计算量

GhostNet:More Features from Cheap Operations

论文:https://arxiv.org/pdf/1911.11907.pdf

代码:https://github.com/huawei-noah/ghostnet

0

绪论

随着卷积神经网络部署在终端的需求越来越强烈,很多研究者们开始研究如何降低神经网络的计算量。一种方法是在一个已经训练好的网络基础上做一些裁剪和量化,比如模型剪枝、低比特量化、知识蒸馏;另外一种方法是设计高效的神经网络架构,比如MobileNetv1-v3系列、ShuffleNet等等。

特征冗余性是卷积神经网络的重要特性之一,一些轻量化网络的工作恰恰是利用特征的冗余性,通过裁掉部分冗余特征达到模型轻量化的效果。

与其他工作不同,这篇文章并没有刻意裁剪冗余的特征,而是用一种比传统卷积层更轻量化的方法去生成冗余的特征。通过“少量传统卷积计算”+“轻量的冗余特征生成器”的方式,既能减少网络的整体计算量,又能保证网络的精度。

1

动机

下图为针对一输入图片,ResNet-50中间的feature map,图中的30个feature map中,有一些feature map是很相似的,比如图中相同颜色标出的3组feature map。这种现象一定程度上说明了神经网络中feature map的冗余性,神经网络的冗余性有助于网络更全面地理解输入图片。与通过减少冗余性进行网络轻量化的工作不同,这篇文章并没有减少冗余性,而是采用一种新的、计算量小的方法生成冗余特征。

既然feature map具有冗余性,那么完全使用传统的卷积层生成这么冗余的特征是不是有点浪费计算资源了呢?考虑可以用一个输出feature map数量很少的卷积层和另外一个能增加冗余性、计算量小的操作去代替传统网络中的卷积层,既能保证特征冗余性从而保证精度,又能减少网络的整体计算量。

2

Ghost Module

作者提出了用于代替传统卷积层的Ghost module。Ghost module和传统卷积层的区别如下图所示:

使用

















表示输入feature map,其中




是输入feature map的通道数,









分别是输入feature map的高和宽,那么上图中图(a)所示的传统卷积层可以用如下公式表示:












上式中



























表示含有




个通道的输出feature map,



















 分别是输出feature map的高和宽。




表示卷积操作,



















表示卷积核,卷积核尺寸为











表示偏置项。计算整个卷积层,需要做
























次乘法和加法操作,在网络的浅层,



















比较大;在网络的深层,









比较大。

上图中图(b)所示即为作者提出的Ghost module。既然feature map有冗余性,大可不必使用很昂贵的传统卷积层产生所有的feature map;只需要使用传统卷积层产生一部分feature map,然后通过对这部分feature map做简单的线性变换,增加feature map的冗余性,应该可以“模拟”传统卷积层的效果。

因此Ghost module由两部分组成:其一为输出少量feature map的传统卷积层;其二为用于产生冗余feature map的轻量级线性变换层。使用如下2个公式表述上图中图(b)的操作:






















第一个公式表示输出少量feature map的传统卷积层,其中
































表示输出特征,
























表示该卷积操作的卷积核,这个卷积操作的输出feature map通道数要小于传统卷积层的通道数,即






第二个公式表示用于产生冗余特征的线性变换操作,其中




































个feature map。









中的每个feature map  









,都要通过轻量级的线性操作




















,得到




个feature map。

因此这




个feature map通过线性操作共可以得到






个feature map。为了使Ghost module能即插即用地替换传统卷积,即Ghost module输出的feature map数量与传统卷积一致,因此要保证








,且Ghost module中卷积操作的卷积核尺寸、步长、padding等属性要与被替换的传统卷积层一致。

需要特别指出的是,每个














个线性变换中,最后一个线性变换被强行指定为恒等变换,从上图(b)中也可看出来这一点。这里的线性变换











可以为













的卷积操作,当然也可以是其他轻量级的线性操作。

在如上图(b)所示的Ghost module中,左侧的操作计算量为
























;在右侧的操作中,每个














个线性操作中有1个恒等映射,

因此每个









实际上只有






个占用计算资源的线性变换,若采用






卷积作为该线性变换,这部分计算为




























那么Ghost module的总计算量为

又因为








,因此总计算量可以表示为

输出同样通道数和同样的feature map尺寸,传统的卷积层与ghost module的计算量之比为:

一般情况下,






,若令

































3

Ghost Bottleneck

以Ghost module为基础构建Ghost Bottleneck,如下图所示

Ghost Bottleneck的结构参考了如下两篇论文:

  • Deep residual learning for image recognition.

  • Mobilenetv2: Inverted residuals and linear bottlenecks.

Ghost Bottleneck具有如下特点:

  • 每个Ghost Bottleneck中包含2个Ghost module,第1个Ghost module用于扩充特征的通道数,第2个Ghost module用于减少特征的通道数。

  • 参考了ResNet中shortcut结构。

  • 每个Ghost module后面加1个BN层。

  • 参考了MobileNetv2的结构,第1个Ghost module后面有ReLU操作,第2个Ghost module后面没有ReLU操作。

此外,针对stride=2的情况,Ghost Bottleneck又增加了如下操作:

  • shortcut部分包含下采样操作以保证维度一致。

  • 2个Ghost module中间插入stride=2的DWConv层完成下采样操作,并在其后增加1个BN层。

在实际使用过程中,当stride=2时,令Ghost module中的卷积操作为1x1卷积,以减少计算量。

4

GhostNet

使用Ghost Bottleneck构建GhostNet,在构建GhostNet时参考了下面2篇文章提出的网络结构:

  • Searching for mobilenetv3.

  • Squeeze-and-excitation networks.

将MobileNetv3中的bottleneck替换成上文中的Ghost Bottleneck,GhostNet结构如下所示:

上图中的“#exp”一栏的数字,表示Ghost Bottleneck中第1个Ghost module产生的特征通道数;“SE”一栏表示是否使用了squeeze and excite模块。

为了保证计算效率,GhostNet并没有使用MobileNetv3中的hard-swish激活函数。

为了使GhostNet能够平衡计算量与性能,将上述网络结构中的通道数乘以




,使得网络具有扩展性,记作GhostNet-





。GhostNet-





的计算量约为GhostNet-















倍。

5

超参数探索

作者通过实验探索最佳的s值和d值,使用CIFAR-10数据集和VGG结构,使用Ghost module替代VGG中的卷积层,首先令s=2,d={1,3,5,7}构建4个网络,这4个网络以及VGG16的计算量和性能如下表所示:

可以看出当d=3时网络性能最好,当d=5或者d=7时,计算量有一定提升,且网络性能并没有提高。

令d=3,s={2,3,4,5}构建4个网络,这4个网络以及VGG16的计算量和性能如下表所示:

当s=2时性能最好,且计算量是VGG16的一半。

6

实验结果

将上述超参数探索的结果应用于GhostNet,即令GhostNet中的s=2,d=3,为减少计算量,将卷积核尺寸设置为1x1。

在ImageNet训练集上训练,在ImageNet验证集上测试,结果如下表所示:

可以看出在不同计算量下,相比于其他网络,GhostNet都有很优越的性能。

为了证明GhostNet的通用性,将GhostNet-1.1X分别用于RetinaNet和Faster R-CNN框架下,在COCO数据集上做目标检测,效果如下表所示:

从上表可以看出,无论是使用RetinaNet方法还是Faster R-CNN方法,相比于使用其他backbone,使用GhostNet-1.1X作为backbone在保证精度的同时能显著降低计算量。

7

总结

1.利用feature map之间的冗余性,提出了Ghost module,使用轻量级操作(比如DWConv)代替部分传统的卷积层生成冗余特征。

2.以Ghost module为基础构建GhostNet,并通过实验证明了GhostNet的性能和通用性。

3.很适用于基于ARM的终端平台,但是由于现有的AI芯片对DWConv支持不够友好,因此在AI芯片上未必有很高的推理速度。

仅用于学习交流!

(本文为粉丝投稿)

END

备注:部署

模型压缩与应用部署交流群

模型压缩、网络压缩、神经网络加速、轻量级网络设计、知识蒸馏、应用部署、MNN、NCNN等技术,

若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  

重读GhostNet:使用轻量操作代替部分传统卷积层生成冗余特征以减少计算量相关推荐

  1. 卷积计算过程中的减少计算量的优化方式

    大卷积转化为小卷积:根据VGG的思想,对于大的卷积核可以转换为多个相同卷积串联的方式来减少.具体如下: 由图可以看出一个5X5的卷积核可以换成两个3X3的卷积,此时参数的个数由25变成了18(2X3X ...

  2. 高通CVPR神研究:视频处理计算量降低78%,教卷积层自己“挑像素”,卡成PPT的视频纵享丝滑...

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 图像领域,已经限制不住AI算法大牛们的身手了. 现在,随着视频产业火热发展,相关算法也正成为计算机视觉研究的新潮流. 毕竟日常生活中,无论是 ...

  3. Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现

    二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...

  4. 深度学习模型参数量/计算量和推理速度计算

    作者|龟壳 来源 | 知乎 地址 | https://zhuanlan.zhihu.com/p/376925457 本文仅作学术分享,若侵权请联系后台删文处理 本文总结了一些关于模型参数量计算以及推理 ...

  5. Transformer计算量和过程统计

    整理一下Transformer相关论文的计算量和计算流程 一.Vision Transformer Vision Transformer的结构在大佬 "太阳花的小绿豆" 的博文里面 ...

  6. 【深度学习】深度学习中模型计算量(FLOPs)和参数量(Params)等的理解以及四种在python应用的计算方法总结

    接下来要分别概述以下内容: 1 首先什么是参数量,什么是计算量 2 如何计算 参数量,如何统计 计算量 3 换算参数量,把他换算成我们常用的单位,比如:mb 4 对于各个经典网络,论述他们是计算量大还 ...

  7. 卷积核的参数量和计算量

    卷积核的参数量和计算量 1. 参数量计算 1.1 普通卷积 输入特征图尺寸 CxHxW 输出特征图尺寸 OxHxW 卷积核尺寸 kxkxC(O个kxkxC的卷积) 权重 kxkxCxO 偏置 O BN ...

  8. 模型显存占用及其计算量

    1. 显存的占用 当在GPU上跑一个模型时,显存的占用主要有两部分: 模型的输出(特征图.特征图的梯度).模型的参数(权重矩阵.偏置值.梯度) 1. 模型参数的显存占用:(例如:卷积核的参数.BN层. ...

  9. 【最强ResNet改进系列】IResNet:涨点不涨计算量,可训练网络超过3000层!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 [导读]本篇文章是[最强ResNet改进系列]的第四篇文章,前面我们已经介绍了Res2Net和 ...

最新文章

  1. 笔记 | 吴恩达Coursera Deep Learning学习笔记
  2. c#sort升序还是降序_C#中对数组或集合进行升序或降序排序
  3. canvas刮奖效果
  4. UIActivityViewController: LaunchServices: invalidationHandler called
  5. dubbo配置(一)
  6. git回滚到任意版本
  7. mysql创建table w3c_MySQL ALTER命令
  8. [转载] java程序员快速学c++
  9. C++ (tensorRT中学习)
  10. 是什么让Go语言更适合人工智能研究?
  11. 语音识别介绍(上篇)
  12. Leetcode 199.二叉树的右视图
  13. 视频在html不能播放器,网页播放器打不开的解决方法
  14. “百度有啊”可以访问了,大家预测一把其前景如何?
  15. BF发卡网开源源码+详细教程
  16. 音频的相关基础知识,这里有
  17. 如何破解超级用户密码?
  18. 计算机安全论文摘要,信息安全论文摘要.doc
  19. 谷歌2018博士生奖研金名单出炉,清华、上交大多人入选
  20. 一个靠谱的成都java培训机构应该具备哪些特点?

热门文章

  1. 查看tensorflow是否支持GPU,以及测试程序
  2. NDK编译c包含C++头文件时,出现 error: unknown type name 'class' 的解决方法
  3. Hibernate学习笔记--导航
  4. form必填默认校验_Salesforce LWC学习(十六) Validity 在form中的使用浅谈
  5. 微服务启动顺序_基于华为云CSE微服务接口兼容常见问题
  6. mvc模式 mysql做网页_SpringMVC + Hibernate + MySQL 的简易网页搭建(Control实现篇)
  7. unity许可证不可用_不可思议之梦蝶从PC版移植到Nintendo Switch经验分享(上)
  8. c语言简易调度器,给大家分析SD调度器
  9. 数据包格式_RAW与JPEG格式怎么选??
  10. it转正述职报告_三年产品经理的转正述职报告