ANTNet|端侧架构,精度速度双超MobileNetV2
paper: https://arxiv.org/abs/1904.03775
code: https://github.com/yyxiongzju/ANTNets
Abstract
DCNN在计算机视觉领域取得了前所未有的成功,然而它需要大量的计算资源方能获得高性能。尽管深度分离卷积是一种比标准卷积更有效的计算单元,但它往往会导致模型的表达能力降低。基于资源负载约束(比如计算消耗和参数量),作者提出一种新颖的模块ANTBlock。通过在ANTBlock中引入注意力机制(位于depthwise卷积与投影层之间,与MobileNetV3类似),它可以在高维空间提升模型的表达能力。
作者通过实验表明:基于ANTBlock构建的ANTNet可以跨数据集取得更优的性能(相比同等计算消耗的端侧网络架构,比如MobileNet与ShuffleNet系列)。在CIFAR100数据集上,所提方法取得了75.7%的top1精度,它比MobileNetV2高1.5%且少8.3%的参数量与19.6%的计算量;在ImageNet数据集上,所提方法取得了72.8%的top1精度,它比MobileNetV2高0.8%,同时在iphone5上的速度为157.7ms(比MobileNetV2快20%)。
该文的贡献主要包含以下几点:
- 提出了一种高效且强有力的架构模块ANTBlock,它可以动态的利用通道相关性;
- 由于简单的使用SE模块并不会改善深度分离卷积的性能,作者提出了一种最优配置以最大化通道数量,同时具有全局感受野;
- 采用组卷积使得ANTBlock更高效,即具有更少参数量与计算复杂度,同时不会引起性能显著下降;
- 所提ANTBlock易于实现并取得了优于其他轻量型CNN的性能,比如在精度不低于MobileNetV2的前提下,速度快20%。
Method
该文的目的在于:设计一种低计算复杂度的架构模块并用于构建端侧高效CNN网络。一般端侧模型的评价采用MAdds、FLOPs以及参数量等指标。所以该文的目的就在于构建一个具有更少MAdds、更少参数量、更高精度的CNN架构。ANTNet的核心模块为ANTBlock,而该模块主要采用了深度分离卷积与通道注意力机制。
关于深度分离卷积的计算量已有太多的资料、博客进行分析,所以这里就不再赘述了。同时,轻量型网络的基础模块往往采用逆残差模块形式,逆残差模块是MobileNetV2一文提出的一种网络模块,关于MobileNetV2的介绍资料实在太多了,略过。这里直接开始介绍ANTBlock。
ANTBlock
下图给出了ANTNet以及ANTBlock的网络架构示意图,ANTNet采用了非常经典的网络架构形式,好像自从ResNet提出依赖基本上都是采用这种形式的架构了。
言归正传,很明显ANTBlock采用了残差模块的架构,在MobileNetV2的Inverted Residual Block, IRB
的基础上进行改进,其实改进也非常的简单,就是在depthwise卷积后添加了一个SE模块。它与IRB的另一个不同之处:最后一个1x1卷积为组卷积形式。
不知道各位同学有没有考虑过为什么SENet、ANTNet、SKNet、MobileNetV3等注意力模块在残差模块中添加的位置不一样?比如SENet与SKNet是添加到残差模块最后一个卷积之后,而ANTNet、MobileNetV3等轻量型网路则是添加到Depthwise卷积之后。这是为什么呢?留给各位同学思考思考哈。
下表给出了ANTBlock中每个计算单元的类型以及计算复杂分析。
e-ANTBlock
作者在ANTBlock的基础上提出了一种扩展版本:e-ANTBlock,其结构示意图如下所示。
上面的模块是比较简单的,就是在一个残差模块中又多添加了一个分支。这种类型的模块可以描述为:
其中m表示ANTBlock的数量(默认为2),
表示ANTBlock的加权值,该权值为softmax输出,形式如下:
这里又出现一个小彩蛋:大家有没有发现这篇论文与今年新出的一篇屠榜论文结构非常相似呢?各位同学可以在下方留言哈
ANTNet
其实了解了ANTBLock后,如何进行ANTNet网络搭建就是非常简单的事情了。参考这MobileNetV2进行设计就OK了嘛,事实上也是如此。关于ANTNet的网络架构信息见下表,这里就不再赘述了。
Experiments
直接上结果吧,下表给出了所提方法在CIFAR100数据集上的性能对比。相比MobileNetV2与ShuffleNetV2两大知名端侧模块,所提方法具有更高的精度。
image-20200731145119700
下表给出了ImageNet数据集上所提方法的性能对比。很明显,ANTNet再一次优胜。
最后给出了ANTNet与MobileNetV2在iphone5s端侧的耗时对比,见下表。注:g=2为默认配置,等同于前述的proposed模型。
全文到此结束,更多实验结果与分析请查看原文。
- 再免费多看一章--k-means++
- 面向对象先导课感想
- 【LATEX】个人版latex论文模板
- 【前端】wangEditor(富文本编辑器) 简易使用示例
- 【前端】ACE Editor(代码编辑器) 简易使用示例
- LOJ#6277. 数列分块入门 1
- 【Ruby on Rails】Model中关于保存之前的原值和修改状态
- 一个很逗的东西——Jd
- SQL Server 数据库清除日志的方法
- 算法模板——平衡树Treap 2
- DTS,DTC, DTB你都认识吗?
- LOJ#6278. 数列分块入门 2
- 1901: Zju2112 Dynamic Rankings
- LOJ#6279. 数列分块入门 3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Koa - 中间件(理解中间件、实现一个验证token中间件)
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
- 原生js 复制内容到剪切板
- Vue - watch高阶用法
- 小程序如何支持使用 async/await (构建npm版)
- require.context批量引入文件
- Node笔记 - process.cwd() 和 __dirname 的区别
- 小程序如何支持使用 async/await
- 小程序 - 如何自定义导航栏
- protobuf 语法 与 protocol-buffers 的使用
- 小程序 - 简单实现mixin功能
- 记录一些小技巧-CSS篇
- 记录一些小技巧-JS篇
- 初次在Vue项目使用TypeScript,需要做什么
- VScode - 10个提高工作效率的快捷键