GhostNet: More Features from Cheap Operations
Kai Han, Yunhe Wang, Qi Tian, Jianyuan Guo, Chunjing Xu, Chang Xu
Huawei Noah’s Ark Lab, Peking University, University of Sydney, Australia, 2019
CNN在嵌入式设备上的部署受制于内存与计算资源,通常都很困难。CNN特征图有一定冗余,这是它的重要特性,但这一点很少在架构设计中被关注到。这篇论文提出了Ghost
模块,可以用很小的运算量来生成更多的特征图。在ImageNet上,用相同的计算量获得了比MobileNetv3更高的精度。代码以及ImageNet预训练权重已开源。
Introduction
训练好的CNN输出的特征图信息非常丰富,甚至有点多余,这保证了模型对输入数据的理解。图1是ResNet-50的特征图,可以看到有许多相似的特征图对,互相都像幽灵Ghost。特征图冗余是使CNN获得成功的重要特征。与其避免它,我们选择了拥抱这一特质,只是用了一种更经济的方式。
Approach
Ghost Module for More Features
普通卷积输入有n个通道,hw宽高的数据,卷积核为$k*k$,共c个卷积核时,其FLOPs约为$n \cdot h^{\prime} \cdot w^{\prime} \cdot c \cdot k \cdot k$
图2b则是Ghost模块,首先卷积得到较少的特征图(m个)。再用经济的线性操作,基于m个特征图得到m*(s-1)
个特征图,再与原来的m个特征图concat就得到了输出。
GhostNet架构主要源自MobileNetv3,将其中的bottleneck替换为ghost bottleneck。
Experiments
Toy Experiments
论文首先放出了一个“玩具”式的实验。图1可视化说明特征图之间有高度相似的。因此将那些成对的特征图取出,其中一个作为输入,另一个作为输出来训练一个小的DW卷积,即线性操作$\Phi$。其结果如下
可以看出MSE值都是很小的,这说明了DNN中的特征图间有着很大的相关性,而这些冗余特征图可以通过几个已有的特征图生成。除了上面用到的卷积,也可以探索一些低花费的线性操作来构建Ghost module,如仿射affine变换和小波wavelet变换。但卷积已是一种呗现代硬件所支持的高效操作,而且本身可以覆盖许多常用线性操作,如平滑、模糊、运动等。
第一遍阅读时没注意到这里,所以读到它的pytorch代码时,看到是用DW做的变换还有点惊讶:
class GhostModule(nn.Module): |
此外,线性变换$\Phi$的尺寸也是可以学习的,但异构的模块会降低计算单元的效率,因此GhostModule中的d都是固定值,且使用了DW卷积作为线性映射。
剩余的性能比较就不贴上来了,总之在各种数据集、任务上,同样的速度下准确率都高于mobilenetv3。