论文题名:《GhostNet: More Features from Cheap Operations》
arxiv: https://arxiv.org/abs/1911.11907
github :https://github.com/huawei-noah/ghostnet
GhostNet是华为诺亚方舟实验室最新的轻量级深度学习网络,作者从卷积神经网络特征图冗余这一特点出发,设计了类似于深度可分离卷积这种分阶段进行操作的计算模块,简单来说就是在非线性卷积的基础上再进行一次线性卷积,以达到在较低计算量的情况下获得更多特征图的目的。
1.设计思想来源
本文作者在观察ResNet50第一个残差块输出的特征图时,发现有许多输出特征很相似,图一中的红、绿、蓝框的特征图,作者认为很相似,基本只要进行简单的线性变换就能得到,而不需要进行复杂的非线性变换得到(注意:文中说的卷积操作是卷积-批归一化-非线性激活全套组合,而所谓的线性变换或者廉价操作均指普通卷积,不含批归一化和非线性激活。)
图一 ResNet50 部分特征图2.模块设计
依据上述现象,作者提出了一种叫做Ghost module的轻量级计算模块,具体思路是:先进行一次普通的卷积(即卷积-批归一化-非线性激活),只不过它的输出特征图数量要少很多,目的就是减少计算量,然后在这个基础上通过线性变换(即卷积),这个线性变换更加具体一点是深度卷积,输出包含一个恒等映射图和s-1个其他特征图(s为第一次卷积后的每个特征图变换的次数),文中恒等映射前后叫做Intrinsic feature maps,经过线性变换后(除恒等映射的特征图)叫做Ghost feature maps,具体过程如下图2所示:
图二 Ghost module该模块涉及到2个非常重要的参数,s和d 分别是线性变换的次数以及线性变换过程中卷积核的大小,本文给出的结果是这两者分别取2和3最合适,不过我觉得,在实际开发过程中还需要手工测试。
3.计算量和参数量对比
Ghost 模块为什么可以称为轻量化模块,当然是在计算量和参数量这边有下降喽!
3.1 计算量对比
假设输入数据的张量是chw,分别为输入通道、特征图高和宽,经过一次卷积后输出数据的张量为nh'w',分别为输出通道、输出特征高和宽,卷积核大小为k,线性变换卷积核大小为d,经过s次变换,那么普通的卷积操作(bn和relu不纳入计算量对比这里)的计算量与Ghost 模块的计算量对比为:
图3 计算量对比n/s是第一次变换时的输出通道数目,s-1是因为恒等映射不需要进行计算,但它也算做第二变换中的一部分,Ghost 模块之所以能省计算量,就在这里,最后,k和d均取3,主要是3x3卷积在网络设计中是最常用的。
3.2 参数量对比
参数量对比就更加简单了,只要计算卷积核就行了,这里就不过多赘述。
图4 参数量对比4.GhostNet网络结构
GhostNet的网络设计也是延用了ResNet的残差瓶颈结构,先降维后升维的设计,如下图所示:
图5 GhostNet网络 基础块同时用到了由MobileNetV2提出的一个网络设计技巧,就是在第一块Ghost module之后不进行非线性激活,因为深度卷积后再加ReLU效果会变差,可能是深度卷积输出太浅了, 应用 ReLU会带来信息丢失。
GhostNet网络整体结构如下:
图6 GhostNet网络整体结构其中这里面需要关注的就是SE模块和最后在输出的时候使用1x1卷积再计算一次,SE模块的使用是为模型添加注意力机制,对特征进行筛选,起到特征重标定的作用,具体可以查看SENet,1x1卷积的使用是为了实现跨通道的交互和信息整合。
网友评论