开始把前面看的论文好好总结一下了,冲冲冲。这个呢算是第二篇,比第一篇SqueezeNet有了部分可以借鉴的东西。
论文名称:GhostNet: More Features from Cheap Operations
链接:原文链接
代码:GithubPytorch代码
百度网盘:原文链接
提取码:r943
这篇文章来源于华为诺亚和北大,在ImageNet分类数据集上与MobielNetV3相比在相似计算复杂度的情况下。top-1上的正确率达到75.7%
由于内存和计算资源有限,很难在嵌入式设备上部署卷积神经网络(CNN)。特征图中的冗余是那些成功的CNN的重要特点,但很少在神经体系结构设计中进行研究**。本文提出了一种新颖的Ghost模块,可以通过简单的操作生成更多的特征图。基于一系列内在的特征图,我们应用了一系列简单的线性变换以生成许多ghost特征图,这些ghost特征图可以充分揭示内部特征的信息。提出的Ghost模块可以作为即插即用组件来升级现有的卷积神经网络**。Ghost boottlenecks 旨在堆叠Ghost模块,然后可以轻松建立轻量级的GhostNet。实验表明:我们的GhostNet可以实现比MobileNetV3更高的识别性能(例如75.7%top-1精度)。
PS: 这一段主要是方便我们以后写Introduction与Related Work
CNN 在图像分类,目标检测,语义分割领域都展现卓越的性能。传统的CNN通常需要大量参数和浮点运算(FLOPs)才能获得令人满意的精度. 例如:ResNet-50 具有约25.6M参数量(parameters),需要4.1B FLOPs来处理尺寸为224×224的图像。因此,深度神经网络设计的最新趋势是探索对移动设备具有可接受性能的便携式高效网络体系结构(如智能手机,自动驾驶汽车).
多年来,提出了一系列方法来研究紧凑型深度神经网络。例如网络剪枝,低位量化,知识蒸馏,根据权重修剪神经网络。
除此之外,高效的神经体系结构设计在建立具有较少参数和计算量的高效深度网络方面具有很高的潜力,并且最近取得了巨大的成功。这种方法还可以为自动搜索方法提供新的搜索单元。如:mobileNet, shuffleNet.
在训练有素的深度神经网络的特征图中,丰富甚至冗余的信息常常保证了对输入数据的全面理解。例如,如图展示了由ResNet-50生成的输入图像的一些特征映射,并且存在许多相似的特征映射对,就像彼此的幽灵一样。特征图中的冗余度是深度神经网络成功的重要特征。我们并没有避免冗余的特性映射,而是倾向于采用它们,但采用的是一种低成本的方式。
下图为输入图像经ResNet50产生的特征图,里面有许多成对的相似特征图
在本文中,我们介绍了一种新颖的Ghost模块,可以使用更少的参数来生成更多特征。具体来说,深度神经网络中的普通卷积层将分为两部分。
第一部分涉及普通卷积,但是将严格控制它们的总数。在第一部分的固有特征图基础上,经过一系列简单的线性运算,用于生成更多特征图。与普通卷积神经网络相比,在不更改输出特征图大小的情况下,该Ghost模块中所需的参数总数和计算复杂度均已降低。基于ghost模块,我们涉及一个高效的网络结构叫做GhostNet. 我们首先在benchmark神经体系结构中替换原始的卷积层,以证明Ghost模块的有效性,然后验证GhostNets在多个benchmark视觉数据集上的优越性。
实验结果表明,所提出的Ghost模块能够降低通用卷积层的计算成本,而保留类似的识别性能,GhostNets可以在各种任务上超越移动设备上的快速推断,从而超越最新的高效深度模型,例如MobileNetV3 。
深度卷积神经网络通常由大量卷积组成,从而导致大量的计算成本。尽管MobileNet和ShuffleNet等最近的工作引入了深度可分离卷积或混洗操作,以使用较小的卷积filter来构建有效的CNN,但是剩下的1×1卷积层仍然占用大量内存和FLOPs。
根据图可以看出,卷积神经网络的特征图包含大量的冗余特征信息,很多特征图之间比较相似。我们指出没有必要占用大量资源逐个生成特征图。假设输出特征图是少数具有某些简单变换的特征图的“幽灵”。这些固有的特征图通常较小,由普通的卷积过滤器产生。
普通的卷积操作如图a,Ghost模块对此进行了改进,第一步是使用更少的卷积核生成输出特征图feature maps,如原本的个数是n,现在的是m。第二步是对第一步生成的每一张特征图进行cheap operations(深度卷积),每张特征图生成s张新特征图(包括一张恒等变换),总共是 m × s m\times s m×s张,并保证 m × s m \times s m×s,这样保证Ghost模块与普通卷积输出的特征形状相同。第三步是将这些特征图拼接到一起。
Ghost模块的初始卷积公式: Y ′ = X × f ′ Y^{'}=X\times f^{'} Y′=X×f′.其中 Y ′ ∈ R h ′ × w ′ × m Y^{'}∈ R^{h^{'}\times w^{'}\times m} Y′∈Rh′×w′×m,其中m是初始卷积中卷积核的数量,其余超参数如卷积核尺寸,步长与普通conv一致
并且为了进一步得到相同的 n n n特征图,利用下面的简单的线性算子在固有特征图 Y ′ Y^{'} Y′ 上产生 s s s个影子特征图。
y i ′ y_i^{′} yi′表示在Y’中的第i个内在特征映射,在上式中 Φ i , j Φi,j Φi,j是用于生成第j个ghost特征映射 y i j y_{ij} yij的第j个线性操作,也就是说yi′可以有一个甚至多个ghost特征映射 y i j s j = 1 {yij}^sj=1 yijsj=1。最后一个Φi,s是用来保存如图2(b)所示的内在特征映射的identity映射。
通过使用等式,我们能够获得n = m*s channels的特征映射, Y = [ y 11 , y 12 , ⋅ ⋅ ⋅ , y m s ] Y = [y11,y12,··· ,yms] Y=[y11,y12,⋅⋅⋅,yms]即如图2(b)所示的一个Ghost模块的输出数据。注意,线性操作 Φ Φ Φ操作在每个通道的计算成本远小于普通的卷积。在实际应用中,在一个Ghost模块中可能会有几种不同的线性运算,例如3×3和5×5的线性内核,这些将在实验部分进行分析。
Difference from Existing Methods:提出的Ghost模块与现有的高效卷积方案有很大的不同。
Ghost Bottlenecks: 利用Ghost模块的优点,我们介绍了专门为小型CNNs设计的Ghost bottleneck(G-bneck)。如图3所示:
Ghost bottleneck看起来类似于ResNet[16]中的基本residual块,其中集成了几个卷积层和shortcut。提出的ghost bottleneck主要由两个堆叠的ghost模块组成。第一个Ghost模块作为扩展层,增加通道的数量。我们把输出通道数与输入通道数之比称为扩展比(expansion ratio)。第二个Ghost模块减少通道的数量以匹配shortcut。然后将这两个Ghost模块的输入和输出连接起来。除了根据MobileNetV2[44]的建议在第二个Ghost模块之后不使用ReLU外,每一层之后都使用batch归一化(BN)[25]和ReLU非线性函数。
上面描述的Ghost bottleneck是stride=1的情况。对于stride=2的情况,通过向下采样层实现shortcut路径,并在两个Ghost模块之间插入stride=2的depthwise卷积。在实际应用中,Ghost模块中主要的卷积是pointwise卷积,以提高其效率。(即stride=1的情况是不改变输出的宽高,只改变channels数;stride=2是不改变channels数,只下采样一倍宽高)
GhostNet.基于ghost bottleneck,我们建议使用如图所示的GhostNet:
我们基本上遵循了MobileNetV3架构的优势,用我们的Ghost bottleneck代替了MobileNetV3中的bottleneck块。GhostNet主要由一组Ghost bottleneck组成,Ghost模块作为构建块。第一层是标准的卷积层,有16个filter,然后是一系列的Ghost bottleneck,通道逐渐增加。这些Ghost bottleneck根据其输入特征图的大小被分组到不同的阶段。所有的Ghost bottleneck都使用stride=1,除了最后一个阶段使用stride=2。最后利用全局平均池化层和卷积层将特征映射转化为一个1280维的特征向量进行最终分类。。
与MobileNetV3相比,我们没有使用hard-swish非线性函数,因为它有很大的延迟。所提出的体系结构提供了一个基本的设计参考,但进一步的超参数调整或基于ghost模块的自动体系结构搜索将进一步提高系统的性能。
Width Multiplier:尽管表7中的给定架构已经可以提供低延迟和保证精度,但在某些场景中,我们可能需要更小、更快的模型或更高的特定任务的精度。为了期望的需求可以定制网络,我们可以简单地在每一层channels的数量上均匀地乘以一个系数α。这个因子α称为宽度乘数,因为它可以改变整个网络的宽度。我们表示带有宽度乘数α的GhostNet为GhostNet-α×。宽度乘数可以控制模型大小和计算成本大约 α 2 α^2 α2。通常小α导致更低的延迟和更低的性能,反之亦然。
我们在图1中展示了一个图表,指出存在一些类似的特征映射对,它们可以使用一些有效的线性操作来有效地生成。
这里,我们首先进行一个toy实验来观察原始特征图和生成的Ghost特征图之间的重构误差。以图1中的三对(即红色、绿色和蓝色)为例,使用ResNet-50[16]的第一个residual块提取特征。在左边的特征作为输入,另一个作为输出,我们利用一个小depthwise卷积过滤器学习映射,即它们之间的线性操作Φ。卷积滤波器d的大小范围为1 ~ 7,不同d对的MSE(均方误差)值如表2所示:
从表2可以看出,所有的MSE值都非常小,这说明在深度神经网络中,特征映射之间存在很强的相关性,这些冗余特征可以由多个固有的特征生成。除了上述实验中用到的卷积,我们还可以探索其他一些低成本的线性操作来构造Ghost模块,如仿射变换(affine)和小波变换(wavelet)。然而,卷积是一种高效的运算,已经得到了当前硬件的良好支持,它可以涵盖许多广泛使用的线性运算,如平滑、模糊、运动等。此外,虽然我们也可以学习关于Φ线性操作中每个过滤器的大小 ,不规则的模块将降低计算单元的效率(例如CPU和GPU)。因此,在接下来的实验中,我们建议让Ghost模块中的d为一个固定值,利用深度卷积实现等式3,构建高效的深度神经网络。
如等式3所述,为高效的深度神经网络提出的Ghost模块有两个超参数,即s和d,s用于生成m = n / s个内在特征映射,d即用于计算ghost特征图的线性操作的内核大小d×d(即depthwise卷积过滤器的大小)。在VGG-16架构上测试了这两个参数的影响。
首先,我们固定s = 2并调节d为{1,3,5,7}中之一,并在表3中列出了CIFAR-10验证集的结果:
我们可以看到,提出的d = 3的Ghost模块比d值较小或较大的Ghost模块性能更好。这是因为尺寸为1×1的kernel不能在特征映射上引入空间信息,而尺寸较大的kernel如d = 5或d = 7会导致过拟合和增加计算量。因此,我们在接下来的实验中采用d = 3来进行有效性和效率的检验。
在研究了所提议的Ghost模块中使用的内核大小之后,我们保持d = 3,并在{2,3,4,5}范围内调优其他超参数s。事实上,s与得到的网络的计算代价直接相关,即如等式5和等式4所分析的,s越大,压缩比和加速比越大。从表4的结果可以看出,当我们增加s的时候,FLOPs明显减小,准确率逐渐降低,这是可以预料到的。特别是当s = 2时,也就是将VGG-16压缩2倍,我们的方法比原模型的性能稍好一些,说明了所提出的Ghost模块的优越性。
虽然生成的特征映射来自于主要的特征映射,但是它们确实有显著的差异,这意味着生成的特征足够灵活,可以满足特定任务的需要。
为了降低现有深度神经网络的计算成本,本文提出了一种新的Ghost模块来构建高效的神经网络结构。基本Ghost模块将原始卷积层分成两部分,并使用较少的滤波器来生成若干内在特征映射。
然后,进一步应用一定数量的廉价变换操作来高效地生成fghost特征图。在基准模型和数据集上进行的实验表明,该方法是一个即插即用的模块,可以将原始模型转换为紧凑的模型,同时保持相当的性能。此外,使用提出的新模块构建的GhostNet在效率和准确性方面都优于最先进的可移植神经结构