作者丨Ziyang Li

编辑丨极市平台

导读

本文围绕网络部署时面临的内存和资源问题,分享了如何从可视化和大量实验结果中得到Ghost特征的思想。作者设计出相比C-Ghost更适用于GPU等设备的G-Ghost,在实际延迟与性能之间取得了良好的权衡。

一、写在前面的话

本文针对网络部署时面临的内存和资源有限的问题,提出两种不同的Ghost模块,旨在利用成本低廉的线性运算来生成Ghost特征图。C-Ghost模块被应用于CPU等设备,并通过简单的模块堆叠实现C-GhostNet。适用于GPU等设备的G-Ghost模块利用阶段性特征冗余构建。最终实验结果表明两种模块分别实现了对应设备上精度和延迟的最佳权衡。

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

代码地址:https://github.com/huawei-noah/CV-Backbones

二、导读

在GhostNet(CVPR 2020)出现之前,笔者对冗余特征一直保持刻板的偏见。但不管是过分的抑制冗余,还是过分的增加冗余,都会对架构性能造成不好的影响(存在即合理)。在GhostNet中,作者的等人通过细致的实验观察,提出“以有效方式接受冗余特征图”的思想,将以往的特征生成过程用更廉价的线性运算来替代,从而在保证性能的同时实现轻量化。

如下图所示,对中间特征图进行可视化之后,可以明显看出一些特征表达近似(图中用相同颜色标出的方框),因此作者等人提出,近似的特征图可以通过一些廉价的操作来获得。

图1:ResNet50中第一个残差组产生的一些特征图的可视化。

据此,作者等人提出GhostNet,并在本文中称作C-GhostNet,因此笔者将解读的重点放在G-Ghost,对C-Ghost仅做回顾。

C-GhostNet中为实现轻量化,使用了一些低运算密度的操作。低运算密度使得GPU的并行计算能力无法被充分利用,从而导致C-GhostNet在GPU等设备上糟糕的延迟,因此需要设计一种适用于GPU设备的Ghost模块。

作者等人发现,现有大多数CNN架构中,一个阶段通常包括几个卷积层/块,同时在每个阶段中的不同层/块,特征图的尺寸大小相同,因此一种猜想是:特征的相似性和冗余性不仅存在于一个层内,也存在于该阶段的多个层之间。下图的可视化结果验证了这种想法(如右边第三行第二列和第七行第三列的特征图存在一定相似性)。

图2:左边为ResNet34第二阶段的所有卷积块,右边为该阶段的第一块和最后一块的特征图。

作者等人利用观察到的阶段性特征冗余,设计G-Ghost模块并应用于GPU等设备,实现了一个在GPU上具有SOTA性能的轻量级CNN。

三、C-GhostNet回顾

图3:卷积层和C-Ghost模块的示意图。

如图3,给定输入,一个普通的卷积过程可以表示为:

其中,,表示由尺寸为的特征图生成尺寸为的特征图。由可视化结果可知,输出特征图中包含一些冗余存在,因此可以使用更廉价的操作来实现冗余生成。

作者等人将输出的特征图看做内在特征与Ghost特征的组合,其中Ghost特征可以通过作用于内在特征的廉价操作获得,具体过程如下:

对于需要的输出尺寸,首先利用一次普通卷积生成m个本征特征图,即,其中,。接着对中的每一个特征图进行廉价操作以生成s个Ghost特征(n=m×s),可用公式表示:

代表中的第i个特征图,是生成第j个鬼魂特征图的第j个(最后一个除外)廉价操作,不进行廉价操作,而使用恒等映射来保留内在特征。

一份简单的C-Ghost模块代码示例如下所示:

class GhostModule(nn.Module):def __init__(self, in_channel, out_channel, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):super(GhostModule, self).__init__()self.out_channel = out_channelinit_channels = math.ceil(out_channel / ratio)new_channels = init_channels*(ratio-1)#  生成内在特征图self.primary_conv = nn.Sequential(nn.Conv2d(in_channel, init_channels, kernel_size, stride, kernel_size//2, ), nn.BatchNorm2d(init_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)#  利用内在特征图生成Ghost特征self.cheap_operation = nn.Sequential(nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels),nn.BatchNorm2d(new_channels),nn.ReLU(inplace=True) if relu else nn.Sequential(),)def forward(self, x):x1 = self.primary_conv(x)x2 = self.cheap_operation(x1)out = torch.cat([x1,x2], dim=1)return out[:,:self.out_channel,:,:]

四、G-GhostNet

上述示例代码中使用低运算密度的depth-wise卷积作为生成Ghost特征的廉价操作,对于GPU等设备来说,无法充分利用其并行计算能力。另一方面,如果能去除部分特征图并减少激活,便可以概率地减少 GPU 上的延迟

Radosavovic等人引入激活度(所有卷积层的输出张量的大小)来衡量网络的复杂性,对于GPU的延迟来说,激活度比 FLOPs更为相关。

如何实现这一目标?就得利用导读部分提及的“特征的相似性和冗余性不仅存在于一个层内,也存在于该阶段的多个层之间”。由于现有流行CNN架构中,同一阶段的不同层,其输出特征图的尺寸大小不会发生变化,因此一种跨层的廉价替代便可以通过这一特点来实现。其具体实现过程如下:

在CNN的某个阶段中,深层特征被分为Ghost特征(可通过浅层廉价操作获得)和复杂特征(不可通过浅层廉价操作获得),以图2为例:

图2:左边为ResNet34第二阶段的所有卷积块,右边为该阶段的第一块和最后一块的特征图。

将第二阶段从浅到深的八个层分别记作,···,,假定的输出为,此时设定一个划分比例,那么输出的Ghost特征即为,复杂特征为。

其中复杂特征依次通过8个卷积层获得,具有更丰富的抽象语义信息,Ghost特征直接由的输出通过廉价操作获得,最终的输出通过通道拼接得以聚合。如下图所示():

图4:λ = 0.5 的 G-Ghost 阶段示意图。

但是,直接的特征拼接带来的影响是显而易见的。复杂特征经过逐层提取,包含更丰富的语义信息;而Ghost特征由浅层进行廉价操作所得,可能缺乏一部分深层信息。因此一种信息补偿的手段是有必要的,作者等人使用如下操作来提升廉价操作的表征能力:

图5:λ = 0.5 的含有mix操作的 G-Ghost 阶段示意图。

如图5,复杂特征经过连续的n个卷积块生成,Ghost特征则由第一个卷积块经过廉价操作所得。其中mix模块用于提升廉价操作表征能力,即先将复杂特征分支中第2至第n层的中间特征进行拼接,再使用变换函数,变换至与廉价操作的输出同域,最后再进行特征融合(如简单的逐元素相加)。

图6:mix操作的示意图。

下面以图6为例进行详细说明。如图,有至共n个同一阶段的卷积块输出,其中代表最后一层,即复杂特征;代表第一层,即廉价操作所应用的层。现将至的特征进行拼接,得到特征,并利用函数将Z变换至与廉价操作分支的输出一致的域,函数用公式表示如下:

代表对Z进行全局平均池化得到,和表示权重和偏差,即将Z池化后,通过一个全连接层进行域变换。

图6中两个分支的输出进行简单的逐元素相加,并应用非线性得到Ghost特征。

官方公布的g_ghost_regnet文件中,廉价操作的代码段为:

self.cheap = nn.Sequential(nn.Conv2d(cheap_planes, cheap_planes,kernel_size=1, stride=1, bias=False),nn.BatchNorm2d(cheap_planes),
#             nn.ReLU(inplace=True),)

除了大小为1的卷积核,廉价操作还可以用3×3、5×5的卷积核,或者直接的恒等映射来计算。

五、性能对比

表1:ImageNet各方法比较。

表2:ImageNet各方法比较(GhostX-RegNet)。

六、总结与思考

本文利用可视化观察到的现象和大量的实验结果,提出了Ghost特征的思想,利用“特征的相似性和冗余性不仅存在于一个层内,也存在于该阶段的多个层之间”这一猜测,设计出相比C-Ghost更适用于GPU等设备的G-Ghost,并在实际延迟与性能之间取得了良好的权衡。

同时在G-Ghost中,合理的中间特征聚合模块有效缓解了Ghost特征信息损失的问题。但是Ghost特征与复杂特征的划分比例却需要手动调整,不同的对精度、延迟都有不同的影响,在作者等人的实际测试中,保持着精度与延迟的良好权衡。

另外关于使用C-Ghost、G-Ghost模块构建GhostNet整体网络,论文及代码中均有说明,感兴趣的读者可以自行阅览~

往期精彩回顾适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

【深度学习】华为轻量级神经网络架构GhostNet再升级,GPU上大显身手的G-GhostNet(IJCV22)...相关推荐

  1. 【深度学习】轻量级神经网络 SqueezeNet 讲解

    在深度学习领域,人们一般把注意力集中在如何提高神经网络的准确度上,所以,神经网络的层次越来越深,参数也越来越多,但带来的问题就是神经网络对于硬件的要求越来越高,但在嵌入式硬件上比如手机.自动驾驶的计算 ...

  2. C#中的深度学习:了解神经网络架构

    在这里,我们将向不具备AI知识的读者介绍机器学习(ML)的基础知识,并描述在监督的ML模型中的训练和验证步骤. 下载源1.5 MB ML是AI的一个分支,它通过从一组示例中进行概括而不是接收明确的指令 ...

  3. 顶刊IJCV 2022!华为GhostNet再升级!全系列硬件上最优极简AI网络

    作者丨王云鹤@知乎 来源丨https://zhuanlan.zhihu.com/p/540547718 编辑丨CVer GhostNet作为近年来最流行的轻量级神经网络架构,其在ARM和CPU端的应用 ...

  4. #今日论文推荐# 顶刊IJCV 2022!华为GhostNet再升级,全系列硬件上最优极简AI网络

    #今日论文推荐# 顶刊IJCV 2022!华为GhostNet再升级,全系列硬件上最优极简AI网络 GhostNet作为近年来最流行的轻量级神经网络架构,其在ARM和CPU端的应用已经非常广泛.而在G ...

  5. 【最新综述】轻量级神经网络架构综述

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 深度神经网络已经被证明可以有效的解决图像.自然语言等不同领域的问题.同时伴随着移动 ...

  6. 深度学习几种典型架构

    深度学习几种典型架构 http://blog.sina.com.cn/s/blog_cfa68e330102zfaf.html 介绍几种典型的深度学习架构. 卷积神经网络(CNN) 卷积神经网络由Le ...

  7. 谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析

     谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络.CV.NLP 难点解析 [日期:2016-12-16] 来源:新智元  作者: [字体:大 中 小]  11月22日,谷歌在蒙特利尔的 ...

  8. 深度学习之循环神经网络(4)RNN层使用方法

    深度学习之循环神经网络(4)RNN层使用方法 1. SimpleRNNCell 2. 多层SimpleRNNCell网络 3. SimpleRNN层  在介绍完循环神经网络的算法原理之后,我们来学习如 ...

  9. 深度学习之卷积神经网络(13)DenseNet

    深度学习之卷积神经网络(13)DenseNet  Skip Connection的思想在ResNet上面获得了巨大的成功,研究人员开始尝试不同的Skip Connection方案,其中比较流行的就是D ...

最新文章

  1. Python 正则表达式(分组)
  2. Markdown编辑器“MarkdownPad”下载安装(图)
  3. springboot oauth2登录成功处理器_Spring Boot Security 整合 OAuth2 设计安全API接口服务...
  4. boost::timer::auto_cpu_timer相关的测试程序
  5. C++为什么要内存对齐
  6. 【牛客 - 331B】炫酷五子棋(STLset 或Hash,tricks,二维map标记)
  7. 为什么哈希表的容量一定要是 2的整数次幂?
  8. JFlash软件解锁GD32MCU
  9. 前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?
  10. vue引入echarts-liquidfill水滴图并批量动态加载
  11. 【语音算法】语音的预处理--端点检测
  12. 搭建基于企业微信的SCRM系统
  13. C++知识点(2022.11.26~2023.1.31已完结)
  14. 我的LinkedIn领英之路,如何高效开发外贸客户
  15. 海外市场增长快速,爱贝激战跨境支付蓝海
  16. 简单专注,OV最值得小米学习的地方
  17. 面向智慧文博的知识图谱构建综述
  18. 北大计算机系录取通知书,五年级写出小游戏,广附高一学生拿到北大预录取通知书...
  19. 开始使用spring
  20. Quaetur实验报告

热门文章

  1. 服务器知识:终端连接Linux服务器、重启服务器、重启服务
  2. jqGrid合并rowspan
  3. @Scheduled注解用法
  4. uniapp滚动overflow-y: scroll失效问题
  5. 自学php,用php服务端和swift客户端实现验证登录和注册功能 1
  6. AI换脸必备知识:如何查看显卡型号以及显存大小!
  7. C/C++ Socket - TCP 与 UDP 网络编程
  8. 苹果为什么不直接与谷歌打官司
  9. BUUCTF:[MRCTF2020]摇滚DJ
  10. javascript UniqueID属性