本文讲解的是2020年发布的GhostNet,V1版本
参考笔记:神经网络学习小记录60——Pytorch GhostNet模型的复现详解-CSDN博客
学习视频:Ghostnet网络介绍与构建_哔哩哔哩_bilibili
源码地址:源码连接
论文地址: https://arxiv.org/pdf/1911.11907
目录
1.前言
2020年,华为提出了一个轻量级网络GhostNet
在优秀CNN模型中,特征图存在冗余是非常重要的。如下图所示,是对ResNet-50第一个残差块特征图进行可视化的结果,当给一个神经网络输入一张图片时,我们可以获得特别多的特征图。
利用小扳手连接起来的两幅特征图(Ghost对),它们的相似性就特别高,这就是神经网络中存在的特征图冗杂的情况。如果按照传统的思考方式,可能认为这些特征图存在冗余,是多余信息,会想办法避免产生这些高度相似的特征图
但是作者思路清奇,认为CNN的强大特征提取能力和这些相似的特征图(Ghost对)正相关,不去刻意的避免产生这种Ghost对,而是尝试使用一些计算量更低的操作(Cheap Operations)去生成得更多的Ghost对,这样就可以在保证良好检测效果的情况下,减少模型的参数量与提高模型的执行速度
2.Ghost Module
在学GhostNet之前最好理解深度可分离卷积,特别是深度可分离卷积中的逐通道卷积,不了解的可以看我的另一篇博客:
GhostNet的核心思想就是使用一些计算量更低(Cheap Operations)的操作去生成这些冗余的特征图。
在论文中,作者设计了一个名为Ghost Module的模块,功能是代替普通卷积。
Ghost Module将普通卷积分为两部分,首先进行一个普通的 1 x 1 卷积,这是一个少量卷积,比如正常使用 32 通道的卷积,这里只用 16 通道的卷积,这个 1 x 1 卷积的作用类似于特征整合,生成输入特征层的特征浓缩
然后再作逐通道卷积,它也就是上面提到的Cheap Operations。它利用上一步获得的特征浓缩生成Ghost特征图
Ghost Module其实就是两步简单思想的汇总:
- 利用 1 x 1 卷积获得输入特征的必要特征浓缩
- 利用逐通道卷积获得特征浓缩的相似特征图(Ghost)
如下图,是普通卷积和Ghost Module的对比
普通卷积、Ghost Module
Ghost Module的代码实现:
#Ghost Module
class GhostModule(nn.Module):
def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):
super(GhostModule, self).__init__()
'''
inp: in_channel
oup: out_channel,Ghost Module最终的输出通道数oup
kernel_size: 默认为1,用于1x1卷积层
ratio: 默认设置为2
dw_size: 逐通道卷积的卷积核大小
'''
#GhostModule最终的输出通道数oup
self.oup = oup
#1x1卷积层的输出通道数init_channels
init_channels = math.ceil(oup / ratio)
#逐通道卷积的输出通道数new_channels