论文:GhostNet: More Features from Cheap Operations,CVPR 2020

代码:https://github.com/iamhankai/ghostnet.pytorch/

GhostNet是华为诺亚方舟实验室在CVPR2020提出,可以在同样精度下,速度和计算量均少于SOTA方法。当前神经网络偏向于移动设备应用,一些重于模型的压缩,比如剪枝、量化、知识蒸馏等。另一些着重于高效的网络设计,比如 MobileNet, ShuffleNet 等。

训练好的网络里的feature map存在大量的冗余信息,相追似的 feature map 类似于 ghost,如下图所示:



作者认为:并非所有 feature map 都需要用卷积操作来得到,“ghost” feature map可以用更加廉价的操作来生成,因此,作者就提出了 Ghost module。



Ghost module 如上图所示,可以看到,包括两次卷积。假设output的通道数为 \(init\_channels * ratio\),那么第一次卷积生成 \(init\_channels\) 个 feature map。

第二次卷积:每个 feature map 通过映射生成 \(ratio-1\) 个新的 feature map,这样会生成 \(init_channels*(ratio-1)\) 个 feature map。最后,把第一次卷积和第二次卷积得到的 feature map 拼接在一起,得到output,通道数为\(init\_channels * ratio\)。

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__()
self.oup = oup
init_channels = math.ceil(oup / ratio)
new_channels = init_channels*(ratio-1) # 第一次卷积:得到通道数为init_channels,是输出的 1/ratio
self.primary_conv = nn.Sequential(
nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False),
nn.BatchNorm2d(init_channels),
nn.ReLU(inplace=True) if relu else nn.Sequential()) # 第二次卷积:注意有个参数groups,为分组卷积
# 每个feature map被卷积成 raito-1 个新的 feature map
self.cheap_operation = nn.Sequential(
nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False),
nn.BatchNorm2d(new_channels),
nn.ReLU(inplace=True) if relu else nn.Sequential(),
) def forward(self, x):
x1 = self.primary_conv(x)
x2 = self.cheap_operation(x1)
# 第一次卷积得到的 feature map,被作为 identity
# 和第二次卷积的结果拼接在一起
out = torch.cat([x1,x2], dim=1)
return out[:,:self.oup,:,:]

最有趣的是模块里,第二次卷积,作者也考虑了仿射变换、小波变换等,因为卷积运算有较好的硬件支持,作者更推荐卷积。

Ghost Bottleneck(G-bneck)与residual block类似,主要由两个Ghost模块堆叠二次,第一个模块用于增加特征维度,增大的比例称为expansion ratio,而第二个模块则用于减少特征维度,使其与输入一致。G-bneck包含stride=1和stride=2版本,对于stride=2,shortcut路径使用下采样层,并在Ghost模块中间插入stride=2的depthwise卷积。为了加速,Ghost模块的原始卷积均采用pointwise卷积



在网络架构上,GhostNet 将 MobileNetV3 的 bottleneck block 替换为 Ghost bottleneck,部分 Ghost模块 加入了SE模块。

论文思路比较容易懂,今天就总结到这里。

GhostNet: More Features from Cheap Operations的更多相关文章

  1. GhostNet:more features from cheap operation

  2. GhostNet: 使用简单的线性变换生成特征图,超越MobileNetV3的轻量级网络 | CVPR 2020

    为了减少神经网络的计算消耗,论文提出Ghost模块来构建高效的网络结果.该模块将原始的卷积层分成两部分,先使用更少的卷积核来生成少量内在特征图,然后通过简单的线性变化操作来进一步高效地生成ghost特 ...

  3. 轻量化模型系列--GhostNet:廉价操作生成更多特征

    ​  前言  由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...

  4. CVPR 2020 全部论文 分类汇总和打包下载

    CVPR 2020 共收录 1470篇文章,根据当前的公布情况,人工智能学社整理了以下约100篇,分享给读者. 代码开源情况:详见每篇注释,当前共15篇开源.(持续更新中,可关注了解). 算法主要领域 ...

  5. CVPR 2020论文收藏(转知乎:https://zhuanlan.zhihu.com/p/112337176)

    CVPR 2020 共收录 1470篇文章,根据当前的公布情况,人工智能学社整理了以下约100篇,分享给读者. 代码开源情况:详见每篇注释,当前共15篇开源.(持续更新中,可关注了解). 算法主要领域 ...

  6. Best practices for a new Go developer

    https://blog.rubylearning.com/best-practices-for-a-new-go-developer-8660384302fc This year I had the ...

  7. 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器

    3.4 空间滤波基础 • Images are often corrupted by random variations in intensity, illumination, or have poo ...

  8. Freescale OSBDM JM60仿真器

    OSBDM-JM60 - 9S08JM60 Based OSBDM — It includes interfaces and firmware applied to all the targets s ...

  9. Modules you should know in Python Libray

    前两天被问到常用的python lib和module有哪些?最常用的那几个,其他的一下子竟然回答不上.想想也是,一般情况下,遇到一个问题,在网上一搜,顺着线索找到可用的例子,然后基本没有怎么深究.结果 ...

随机推荐

  1. webpack的入门实践,看这篇就够了

    webpack的入门实践 我会将所有的读者概括为初学者,即使你可能有基础,学习本节之前我希望你具有一定的JavaScript和node基础 文中的 ... ...代表省略掉部分代码,和上面的代码相同 ...

  2. Halcon斑点分析涉及算子及其高阶运用

    涉及算子 获取图像 使用ROI 对齐ROI或图像 校正图像 基础内容这里不再重述 预处理图像(过滤) 基础: mean_image(平均平滑过滤),gauss_filter(高斯滤波),binomia ...

  3. 【板子】数论基础(持续更新ing...)

    #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...

  4. DLL 函数导出的规则和方法

    参考博客:https://blog.csdn.net/xiaominggunchuqu/article/details/72837760

  5. python入门009

    目录 四.列表 1.定义:在[]内,用逗号分隔开多个任意数据类型的值 2.类型转换:但凡能被for循环遍历的数据类型都可以传给list()转换成列表类型,list()会跟for循环一样遍历出数据类型中 ...

  6. 【题解】p2388阶乘之乘

    原题传送门 题解一堆\(O(n)\)算法真给我看傻了. 考虑\(10=2*5\),因子2肯定更多,所以计算因子5的个数即可. 从5到n这\(n-5+1\)个数的阶乘里面,都各自含有一个因子\(5=1* ...

  7. day19 生成器+函数递归

    目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...

  8. nuxt.js使用scss

    1>安装一些loader npm i node-sass sass-loader scss-loader --save-dev 2>在nuxt.config.js中配置(需要全局使用的sc ...

  9. 数据可视化之DAX篇(十七)Power BI表格总计行错误的终极解决方案

    https://zhuanlan.zhihu.com/p/68183990 我在知识星球收到的问题中,关于表格和矩阵(以下统称表格)总计行错误算是常见的问题之一了,不少初学者甚为不解,在Excel透视 ...

  10. 基于animate.css动画库的全屏滚动小插件,适用于vue.js(移动端、pc)项目

    功能简介 基于animate.css动画库的全屏滚动,适用于vue.js(移动端.pc)项目. 安装 npm install vue-animate-fullpage --save 使用 main.j ...