GhostNet: More Features from Cheap Operations
论文: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的更多相关文章
- GhostNet:more features from cheap operation
- GhostNet: 使用简单的线性变换生成特征图,超越MobileNetV3的轻量级网络 | CVPR 2020
为了减少神经网络的计算消耗,论文提出Ghost模块来构建高效的网络结果.该模块将原始的卷积层分成两部分,先使用更少的卷积核来生成少量内在特征图,然后通过简单的线性变化操作来进一步高效地生成ghost特 ...
- 轻量化模型系列--GhostNet:廉价操作生成更多特征
前言 由于内存和计算资源有限,在嵌入式设备上部署卷积神经网络 (CNN) 很困难.特征图中的冗余是那些成功的 CNN 的一个重要特征,但在神经架构设计中很少被研究. 论文提出了一种新颖的 Gh ...
- CVPR 2020 全部论文 分类汇总和打包下载
CVPR 2020 共收录 1470篇文章,根据当前的公布情况,人工智能学社整理了以下约100篇,分享给读者. 代码开源情况:详见每篇注释,当前共15篇开源.(持续更新中,可关注了解). 算法主要领域 ...
- CVPR 2020论文收藏(转知乎:https://zhuanlan.zhihu.com/p/112337176)
CVPR 2020 共收录 1470篇文章,根据当前的公布情况,人工智能学社整理了以下约100篇,分享给读者. 代码开源情况:详见每篇注释,当前共15篇开源.(持续更新中,可关注了解). 算法主要领域 ...
- Best practices for a new Go developer
https://blog.rubylearning.com/best-practices-for-a-new-go-developer-8660384302fc This year I had the ...
- 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器
3.4 空间滤波基础 • Images are often corrupted by random variations in intensity, illumination, or have poo ...
- Freescale OSBDM JM60仿真器
OSBDM-JM60 - 9S08JM60 Based OSBDM — It includes interfaces and firmware applied to all the targets s ...
- Modules you should know in Python Libray
前两天被问到常用的python lib和module有哪些?最常用的那几个,其他的一下子竟然回答不上.想想也是,一般情况下,遇到一个问题,在网上一搜,顺着线索找到可用的例子,然后基本没有怎么深究.结果 ...
随机推荐
- JAVA环境配置(WIN10之64位)
1.下载java开发工具包JDK,https://www.oracle.com/technetwork/java/javase/downloads/index.html进入首页, 点击下载页: 点击下 ...
- html+css快速入门教程(3)
练习: 1.画盒子 2.相框 5 基础选择器 5.1 id选择器 ID选择器与类选择器的定义与引用方式类似,只是定义的符号不一样.ID通常表示唯一值,因此,ID选择器在CSS 中通常只出现一次.如果出 ...
- 【贪心】Emergency Evacuation
题目 大致题意 把指定的人从同一出口送出车外,且同一位置不能同时有两个人,求所需的最短时间. 分析 第一感觉就是利用贪心思想解决问题,但是这道题的数据范围用模拟的话肯定是会爆掉的,所以这是不可取的.我 ...
- Spring Security(一) —— Architecture Overview
摘要: 原创出处 https://www.cnkirito.moe/spring-security-1/ 「老徐」欢迎转载,保留摘要,谢谢! 1 核心组件 一直以来我都想写一写Spring Secur ...
- 巧用transform: scale()
巧用transform: scale() 移动端font-size小于12px时line-height问题 由于出现的场景是字体小于12px的时候,所以可以将原来包括 font-size 在内的属性放 ...
- 简单的JdbcUtil 类
import java.sql.*; /** JDBC工具类 */ public class JdbcUtil { /** * 获取数据库连接对象并返回 * * @return Connection对 ...
- 51Nod 1534 棋子游戏 题解
题目 波雷卡普和瓦西里喜欢简单的逻辑游戏.今天他们玩了一个游戏,这个游戏在一个很大的棋盘上进行,他们每个人有一个棋子.他们轮流移动自己的棋子,波雷卡普先开始.每一步移动中,波雷卡普可以将他的棋子从(x ...
- cf1216E2 Numerical Sequence (hard version) 二分查找、思维题
题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...
- CentOS7下安装Docker《超详细新手教程》
1.使用 root 权限登录 Centos.确保 yum 包更新到最新. sudo yum update 2.卸载旧版本(如果安装过旧版本的话) sudo yum remove docker dock ...
- 源码剖析@ApiImplicitParam对@RequestParam的required属性的侵入性
问题起源 使用SpringCloud构建项目时,使用Swagger生成相应的接口文档是推荐的选项,Swagger能够提供页面访问,直接在网页上调试后端系统的接口, 非常方便.最近却遇到了一个有点困惑的 ...