论文地址:华为诺亚方舟实验室 2020 CVPR
《GhostNet: More Features from Cheap Operations》
该论文提供了一个全新的Ghost模块,旨在通过廉价操作生成更多的特征图。基于一组原始的特征图,作者应用一系列线性变换,以很小的代价生成许多能从原始特征发掘所需信息的“Ghost”特征图(Ghost feature maps)。该Ghost模块即插即用,通过堆叠Ghost模块得出Ghost bottleneck,进而搭建轻量级神经网络——GhostNet。
为了减少网络计算量,作者将传统的卷积分成两步进行,首先通过传统的卷积生成channel较小的特征图以较少的计算量,然后在得到的特征图的基础上,通过cheap operation(depthwise conv,廉价操作)再进一步减少计算量,生成新的特征图,最后将两组特征图拼接到一起,得到最终的output。
卷积操作是卷积-批归一化BN-非线性激活全套组合,而所谓的线性变换或者廉价操作(cheap operation)均指普通卷积,不含批归一化和非线性激活。
在效果较好的CNN模型中,特征图存在冗余是非常重要的,但是很少有人在模型结构设计上考虑特征图冗余问题;
从特征图冗余问题出发,提出一个仅通过少量计算(cheap operations)就能生成大量特征图的结构——Ghost Module;
Ghost Module通过一系列线性操作(a series of linear transformations)生成特征图,其中经过线性操作生成的特征图称为ghost feature maps,而被操作的特征图称为intrinsic feature maps;
Ghost Module的优点:
即插即用:Ghost Module是一个即插即用模块,可以无缝衔接现有的CNN中;
使用Ghost Module组成的Ghost bottlenecks,设计出GhostNet,在ILSVRC-2012上top-1超过Mobilenet-V3,并且参数更少。
本文作者在观察ResNet50第一个残差块输出的特征图时,发现有许多输出特征很相似,图一中的红、绿、蓝框的特征图,作者认为很相似,基本只要进行简单的线性变换就能得到,而不需要进行复杂的非线性变换得到;作者该对其中的一个特征图可以通过廉价操作(图中用扳手表示)将另一特征图变换而获得,可以认为其中一个特征图是另一个的“Ghost”。因为,本文提出并非所有特征图都要用卷积操作来得到,“Ghost”特征图可以用更廉价的操作来生成。
常规卷积:
常规卷积:卷积-批归一化BN-非线性激活,理论计算量=k*k*c*n*w'*h';
Ghost Module:
深度卷积神经网络通常引用由大量卷积组成的卷积神经网络,导致大量的计算成本。尽管最近的工作,例如MobileNet和ShuffleNet引入了深度卷积或混洗操作,以使用较小的卷积核(浮点运算)来构建有效的CNN,其余1*1卷积层仍将占用大量内存和FLOPs。
由于主流CNN计算出的中间特征图中存在大量的冗余,作者提出减少所需的资源,即用于生成它们的卷积核。
步骤
Ghost Module分为两步操作来获得与普通卷积一样数量的特征图:
Step1:少量卷积(比如正常用128个卷积核,这里就用64个,从而减少一半的计算量);
Step2:cheap operations,用图中的Φ表示,Φ是诸如3*3、5*5的卷积,并且是逐个特征图的进行卷积(Depth-wise convolutional,深度卷积)。
例子
假设输入特征图的shape为[28,28,6],首先对输入特征图使用1*1卷积下降通道数,shape变为[28,28,3];再使用3*3深度卷积对每个通道特征图提取特征,shape为[28,28,3],可以看作是经过前一层的一系列线性变换得到的;最后将两次卷积的输出特征图在通道维度上堆叠,shape 变为 [28,28,6];
假设输入数据tensor是c*h*w,分别为输入channel、特征图高和宽,经过一次卷积后输出数据的张量为n*h'*w',分别为输出channel、输出特征图的高和宽,常规卷积核大小为k,线性变换卷积核大小为d,经过s次变换,那么普通的卷积操作(bn和relu不纳入计算量对比这里)的计算量与Ghost 模块的计算量对比为:
n/s是第一次变换时的输出通道数目,s-1是因为恒等映射不需要进行计算,但它也算做第二变换中的一部分,因此Ghost 模块之所以能省计算量。
计算卷积核的参数量:
利用Ghost模块的优势,作者介绍了专门为小型CNN设计的Ghost bottleneck(G-bneck)。
如图所示,Ghost bottleneck似乎类似于ResNet中的基本残差块(Basic Residual Block),其中集成了多个卷积层和shortcut。
Ghost bottleneck主要由两个堆叠的Ghost模块组成:
第一个Ghost模块用作扩展层,增加了通道数,这里将输出通道数与输入通道数之比称为expansion ratio;
第二个Ghost模块减少通道数,以与shortcut路径匹配,然后,使用shortcut连接这两个Ghost模块的输入和输出。
这里借鉴了MobileNetV2,第二个Ghost模块之后不使用ReLU,因为深度卷积后再加ReLU效果会变差,可能是深度卷积输出太浅了, 应用 ReLU会带来信息丢失,其他层在每层之后都应用了批量归一化(BN)和ReLU非线性激活。
上述Ghost bottleneck适用于stride= 1,
对于stride = 2的情况,shortcut路径由下采样层和stride = 2的深度卷积(Depthwise Convolution)来实现。
出于效率考虑,Ghost模块中的初始卷积是逐点卷积(Pointwise Convolution)。
基于Ghost bottleneck,作者提出GhostNet,如下表所示:
作者遵循MobileNetV3的基本体系结构的优势,然后使用Ghost bottleneck替换MobileNetV3中的bottleneck;
GhostNet主要由一堆Ghost bottleneck组成,其中Ghost bottleneck以Ghost模块为构建基础;
第一层是具有16个卷积核的标准卷积层,然后是一系列Ghost bottleneck,通道逐渐增加。这些Ghost bottleneck根据其输入特征图的大小分为不同的阶段;
除了每个阶段的最后一个Ghost bottleneck是stride = 2,其他所有Ghost bottleneck都以stride = 1进行应用;
最后,利用全局平均池和卷积层将特征图转换为1280维特征向量以进行最终分类。SE模块也用在了某些Ghost bottleneck中的残留层;
与MobileNetV3相比,这里用ReLU换掉了Hard-swish激活函数。尽管进一步的超参数调整或基于自动架构搜索的Ghost模块将进一步提高性能,但下表所提供的架构提供了一个基本设计参考。
Ghost模块消融实验:当s=2、d=3的时候,Ghost模块的性能优于更小或更大的Ghost模块。这是因为大小为1的内核无法在特征图上引入空间信息,而较大的内核(例如d=5或d=7)会导致过拟合和更多计算。
特征图可视化:生成的特征足够灵活,可以满足特定任务的需求。
ImageNet分类数据集:通常较大的FLOPs会在这些小型网络中带来更高的准确性,这表明了它们的有效性。而GhostNet在各种计算复杂度级别上始终优于其他竞争对手,主要是因为GhostNet在利用计算资源生成特征图方面效率更高。
硬件推理速度:作者的模型总体上胜过其他最新模型,例如谷歌MobileNet系列,ProxylessNAS,FBNet和MnasNet。
COCO目标检测数据集:GhostNet可以在单阶段的RetinaNet和两阶段的Faster R-CNN框架上达到和MobileNetV2和MobileNetV3类似的mAP。
tensorflow代码实现
pytorch代码实现
华为-2020-CVPR-最新轻量级网络-GhostNet分析
CVPR 2020:华为GhostNet,超越谷歌MobileNet,已开源
仅为学习记录,侵删!