1. 参数数量(params):关系到模型大小,单位通常是M,通常参数用float32表示,所以模型大小是参数数量的4倍
计算公式:
2. 理论计算量(FLOPs):是 floating point operations 的缩写(注意 s 小写,区别于FLOPS每秒浮点运算次数,衡量硬件的指标),指浮点运算数,可以用来衡量算法/模型的复杂度,这关系到算法速度,大模型的单位通常为G,小模型单位通常为M;通常只考虑乘加操作的数量,而且只考虑Conv和FC等参数层的计算量,忽略BN和PReLU等,一般情况下,Conv和FC层也会忽略仅纯加操作的计算量,如bias偏置加和shoutcut残差加等,目前技术有BN和CNN可以不加bias。
计算公式:
计算量 = 输出的feature map * 当前层filter 即(H × W × Cout) × (K × K × Cin)
推荐一个实用的计算工具(pytorch):torchstat
下载链接:https://github.com/Swall0w/torchstat
可以用来计算pytorch构建的网络的参数,空间大小,MAdd,FLOPs等指标,简单好用。
比如:我想知道alexnet的网络的一些参数。
只需要:
from torchstat import stat
import torchvision.models as models
model = model.alexnet()
stat(model, (3, 224, 224))
简介:SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size. 论文的题目直接表达了论文的成果,实现了与AlexNet相同的精度,但只用了1/50的参数量。且模型的参数量最少可以压缩到0.5M,这是AlexNet的1/510的参数量。SqueezeNet提出了Fire Module模块实现了参数优化。
发布时间:2016年2月
论文地址:http://arxiv.org/abs/1602.07360
代码链接(Caffe):https://github.com/DeepScale/SqueezeNet
代码链接(Keras):https://github.com/rcmalli/keras-squeezenet
解析博客:
https://www.jianshu.com/p/fdd7d7353c55
https://mp.weixin.qq.com/s
SqueezeNet网络结构:
其核心结构Fire Module的组合形成。左图是SqueezeNet的整体结构,中图和有图是将ResNet网络中的shortcut引入构建的网络,所以只是一种提升策略与SqueezeNet无关,本文不讲。
SqueezeNet网络中各个层的滤波器参数具体如下:
上图解释:例如 fire2 这个模块在剪枝前的参数是11920,这个参数是怎么计算的?
Fire Module流程:
SqueezeNet++:
从Figure4中发现fire7_e1x1和fire9_e1x1在精度上有折痕,所以增加了fire7_e1x1和fire9_e1x1中通道数量,并把这个模型叫做SqueezeNet++
。
简介:高效的卷积神经网络在移动视觉中的应用
在介绍MobileNet系列之间,先了解一个概念:深度可分离卷积
深度卷积:将卷积核拆分成为但单通道形式,在不改变输入特征图像的深度的情况下,对每一通道进行卷积操作,这样就得到了和输入特征图通道数一致的输出特征图。
逐点卷积:就是1×1卷积。主要作用就是对特征图进行升维和降维
博客解析:
发布时间:2017年
创新点:提出了深度可分离卷积,深度可分离卷积将传统的卷积分两步进行,分别是depthwise和pointwise。首先按照通道进行计算按位相乘的计算,此时通道数不改变;然后依然得到将第一步的结果,使用1*1的卷积核进行传统的卷积运算,此时通道数可以进行改变。
计算量的前后对比:
Kh × Kw × Cin × Cout × H × W
变成了 Kh × Kw × Cin × H × W + 1 × 1 × Cin × Cout × H × W
通过深度可分离卷积,当卷积核大小为3时,深度可分离卷积比传统卷积少8到9倍的计算量。
MobileNet V1模型结构:
该网络有28层,除去了pool层,使用stride来进行降采样:
亮点:
发布时间:2018年
主要改进点:引入了Inverted Residuals(倒残差模块)和Linear Bottlenecks
V1存在的问题:深度卷积部分的卷积核比较容易训废掉:训完之后发现深度卷积训出来的卷积核有不少是空的,这是因为ReLU导致的,简单来说,就是当低维信息映射到高维,经过ReLU后再映射回低维时,若映射到的维度相对较高,则信息变换回去的损失较小;若映射到的维度相对较低,则信息变换回去后损失很大。
Linear bottleneck:
这个模块是为了解决一开始提出的那个低维-高维-低维的问题,即将最后一层的ReLU替换成线性激活函数,而其他层的激活函数依然是ReLU6。
对比一下残差模块和倒残差模块的区别:
残差模块:输入首先经过1x1的卷积进行压缩,然后使用3x3的卷积进行特征提取,最后在用1*1的卷积把通道数变换回去。整个过程是“压缩-卷积-扩张”。这样做的目的是减少3x3模块的计算量,提高残差模块的计算效率。
倒残差模块:输入首先经过1x1的卷积进行通道扩张,然后使用3x3的depthwise卷积,最后使用1x1的pointwise卷积将通道数压缩回去。整个过程是“扩张-卷积-压缩”。为什么这么做呢?因为depthwise卷积不能改变通道数,因此特征提取受限于输入的通道数,所以将通道数先提升上去。文中的扩展因子为6。
将两个模块进行结合,MobileNet v2结构如下图所示。
发布时间:2019年
论文地址:https://arxiv.org/abs/1905.02244?context=cs
代码地址:
概述:结合了v1的深度可分离卷积、v2的Inverted Residuals和Linear Bottleneck、SE模块,利用NAS(神经结构搜索)来搜索网络的配置和参数。
V3两大改进创新点:
一、网络结构改进:
二、互补搜索:
在网络结构搜索中,作者结合两种技术:资源受限的NAS(platform-aware NAS)与NetAdapt,前者用于在计算和参数量受限的前提下搜索网络的各个模块,所以称之为模块级的搜索(Block-wise Search) ,NetAdapt执行局部搜索,用于对各个模块确定之后网络层的微调。
MobilenetV3网络结构:
两个版本,large和small,都是由NAS进行搜索出来的:
简介:一个轻量级的卷积神经网络,专用于计算力受限的移动设备。
发布时间:2017年
论文地址:https://arxiv.org/abs/1707.01083v1
解析博客:
主要思想:逐点组卷积(pointwise group convolution)和通道混洗(channel shuffle)
通道混洗:
通过reshape变换将通道打乱,流程为:
ShuffleNet v1网络结构:
整个架构分为三个阶段:
在ShuffleNet Unit中,参数g控制逐点卷积的连接稀疏性(即分组数),对于给定的限制下,越大的g会有越多的输出通道,这帮助我们编码信息。定制模型需要满足指定的预算,我们可以简单的使用放缩因子s控制通道数,ShuffleNet s×即表示通道数缩放到s倍。
逐点卷积的重要性:
比较相同复杂度下组数从1到8的ShuffleNet模型,通过放缩因子s来控制网络宽度,扩展为3种:
结论:
通道混洗的重要性:
Shuffle操作是为了实现多个组之间信息交流,下表表现了有无Shuffle操作的性能差异:
结论:
ShuffleNet V1总结:
针对现多数有效模型采用的逐点卷积存在的问题,提出了逐点组卷积和通道混洗的处理方法,并在此基础上提出了一个ShuffleNet Unit,后续对该单元做了一系列的实验验证,证明了ShuffleNet的结构有效性。
发布时间:2018年7月
论文地址:https://arxiv.org/abs/1807.11164
解析博客:
背景分析:
作者认为FLOPs是一种间接的测量指标,是一个近似值,并不是我们真正关心的。我们需要的是直接的指标,比如速度和延迟。
上图中,相同的FLOPs的模型,速度上却差别很大。由此作者提出了第一个观点:使用FLOP作为计算复杂度的唯一指标是不充分的。
理由:
在相同的FLOPs下,具有高并行度的模型可能比具有低并行度的另一个模型快得多。如果网络的并行度较高,那么速度就会有显著的提升。
2. 计算平台的不同。 有些平台会对操作进行优化,比如cudnn加强了对3x3conv的优化。
提出了两个效率对比准则:
设计指南:
分别在GPU(GTX 1080Ti)和CPU(晓龙810)上对比了ShuffleNetV1,MobileNetV2的运行时间进行了测试。
结论:
作者从几个不同的方面对运行时间(或速度)进行了详细分析,并为高效的网络架构设计提出了提出四个高效的网络设计指南:
*注:要理解请看ShuffleNet V2开头的博客链接;
基于上面四条准则,回顾v1结构图,对v1违反了以上四个准则的地方进行修改:
V1存在的问题:
问题1. 逐点组卷积增加了MAC违背了G2;
问题2. 瓶颈结构违背了G1,使用太多分组也违背了G3;
问题3. Add操作是元素级加法操作违反了G4。
解决思路:
保持大量且同样宽的通道,即没有密集卷积也没有太多分组。
引进了:channel split
a.b是V1,c.d是V2
改进点:
简介:ThunderNet是旷视和国防科技大学合作提出的目标检测模型,目标是在计算力受限的平台进行实时目标检测。需要关注的地方主要就是提出的两个特征增强模块CEM和SAM,其设计理念和应用的方法都非常值得借鉴。
发布时间:2019年3月
论文地址:https://arxiv.org/pdf/1903.11752.pdf
代码地址:https://github.com/ouyanghuiyu/Thundernet_Pytorch
解析博客:两阶段实时检测网络ThunderNet
backbone:
基于ShuffleNetv2改进得到的SNet。与ShuffleNet区别在于将ShuffleNet中的3x3可分离卷积替换成了5x5的可分离卷积。图片的输入尺寸改为320x320
SNet设计思想:
考虑三个因素:
先前的轻量级模型存在的缺点:
SNet49(speed)、SNet146(trade off)、SNet535(accuracy):
ThunderNet沿用了Light-Head R-CNN的大部分设置,并针对计算量做了部分改进:
CEM:
针对于Light-Head R-CNN中的Global Convolutional Network(增加感受野机制)的计算量问题提出的,融合多尺度局部信息和全局信息来获取更有鉴别性的特征。
C4来自backbone的Stage3,C5来自backbone的Stage4。具体操作过程上图很明显,构造了一个多尺度的特征金字塔,然后三个层相加,完成特征的优化。
SAM:
利用RPN得到的feature map,然后用一个Attention机制对特征进行优化;
这个部分设计实际上是比较好的结合了两阶段模型的RPN网络。RPN网络是用来提出proposal的,在RPN中,我们期望背景区域特征不被关注,而更多地关注前景物体特征。
RPN有较强的判别前景和背景的能力,所以这里的就用RPN的特征来指导原有特征,实际上是一个Spatial Attention,通过1x1卷积、BN、Sigmoid得到加权的特征图,引导网络学习到正确的前景背景特征分布。
这个模块也是非常精妙的结合了RPN以及空间Attention机制,非常insight,有效地对轻量级网络特征进行了优化,弥补了轻量网络特征比较弱的缺点。
实验结果:
在COCO数据集上的结果,可以看出效果依然非常出众。SNet49的ThunderNet在与MobileNet-SSD相近的精度下,速度快了5倍;SNet146的ThunderNet与one-stage相比,有更高的精度;SNet535的ThunderNet精度在和大型的一阶段网络(SSD,DSSD)一致的情况下,计算量显著降低。
总结:
主要提出了两个重要的模块:CEM 和SAM,CEM总的来说是融合了一个小型的FPN+通道注意力机制,以非常少的计算代价提高了模型的感受野,优化了backbone的特征。SAM总的来说是用RPN的特征加强原有特征,本质上是一种空间注意力机制,这种方法或许可以扩展到所有的多阶段检测器中。
结语:
ThunderNet成功超越了很多一阶段的方法,也让我们改变了传统两阶段网络计算量大但精度高的印象。虽然很多论文中都用到了空间注意力机制和通道注意力机制,ThunderNet中通过自己独到的想法,比较完美地融合了这两个部分,有理有据,非常有力。
本文大部分内容只是总结了论文中的主要知识点,如果想近一步了解,可参考文中提到的解析博客,或者去读原论文。