mobilenet v1
要解决的问题:
目前大多数的网络虽然能实现比较高的性能,但网络过于庞大,所以论文要解决的就是轻量化的问题,试图将网络嵌入到移动端。
亮点:
1、将标准的卷积过程分为两步,即depthwise convolution和pointwise convolution,首先将滤波器进行分解,再使用1*1的卷积进行组合。
2、引入了两个超参数width multiplier和resolution multiplier,可以对通道及输入的尺寸进行操作简化模型
相关信息:
1、目前获得较小网络的方法主要有两种,一种是直接训练较小的网络,另一种是压缩已经训练好的网络。直接训练较小的网络,往往在网络的设计上下手,使用一些因式分解网络等等。压缩已经训练好的网络已经有许多的方法,例如product quantization、hashing、pruning、vector quantization 和 Huffman coding。
2、深度可分离卷积在xception网络有所应用,并超越了inception v3版本的性能。
网络设计:
1、利用深度可分离卷积:
假设卷积的输入为,经过标准卷积K最终的输出为,则卷积核的参量有,计算代价为;如果使用深度可分离卷积,则将卷积过程分为两个阶段,第一个阶段使用个卷积核,输出特征图维度为,之后再使用个卷积核,会生成跟原有卷积操作相同维度的特征图,但这样计算代价变为,远远小于原来的卷积操作的计算代价。
2、论文在深度可分离卷积中使用了batch norm与relu,结构如下图所示:
如果将将depthwise和pointwise算为独立的层的话,整体网络共有28层
3、为了进一步精简模型,作者引入了两个超参数,一个是width multiplier,用来精简通道,减小通道数目,使网络变瘦,用来表示,在这个参量的作用下,某一层的计算代价为:
另一个超参数是resolution multiplier,用来减小输入大小,用来表示,与共同作用时,计算代价变为:
需要注意的是,无论减少通道还是减小输入都会使得网络的精度下降,在具体使用时结合需要来使用。
mobilenet v2
要解决的问题:
设计一种轻量化的网络,能够提升网络在不同任务、不同数据集的情况下的性能。
亮点:
1、不再是单纯的结构堆叠,而是从理论推导入手,分析了非线性激活对特征图的影响,证明了其设计的线性瓶颈层的合理性与可行性。
2、提出了一种倒置残差的结构。
相关信息:
1、目前对网络的调整主要在追求一个性能与精确性的平衡,目前已经针对此做了大量的工作,包括进行超参数优化、网络的修剪、引入稀疏性、改变卷积结构等等,现在甚至将强化学习与遗传算法等引入了进来。然而,这些使得网络越来越复杂,这一篇论文追求的是通过理解网络内部的信息传递机制,来指导网络的设计,尽可能的简单化。
网络设计:
1、深度可分离卷积可以大大减小参数,这里仍然沿用,不作过多的介绍。
2、然后来研究一下网络内部信息的流动。考虑一个层组成的深度网络,每一层都有一个的激活张量,在每个张量上,都存在着manifolds of interest,个人理解就是网络针对具体任务所获取的特征图上的必要信息,这些信息弥漫在不同的通道上。然而,其实这些manifolds of interest是可以嵌入特征图的子空间上的,这也是将维度进行压缩能取得较好效果的原理所在。但是,一般来说,卷积之后会跟一种非线性激活操作,这就容易导致问题,以relu为例。如果manifolds在所有的特征图通道上都存在,则relu操作肯定会破坏通道,从而丢失一部分信息,如果relu之后结果全为正,则此时的relu就相当于一个线性分类器,所以,当深度可分离卷积完成后,再使用1*1卷积进行压缩的时候,索性就不要这种非线性激活操作(注意,在大多数层非线性激活是必须的,因为这能增加复杂性,增强网络的拟合能力,而且如果manifolds能嵌入到一个较低维度上,加非线性激活也不会损失信息)。
3、使用残差连接可以增加梯度的传播效率,所以这里也使用了残差连接,而且是一种倒置的残差结构,这里连接的是瓶颈层,从上面来看,瓶颈处已经包含了必要的信息。示意如下:
4、综合上述,结构如下:
先使用1*1的卷积进行升维,在经过深度可分离卷积,再经过1*1卷积进行降维,跟着一个线性瓶颈层。这里看过另一篇博客博主的理解,觉得理解的比较好,深度可分离卷积将空间与通道完全解耦,这样并不完全可取。所以此时将维度增加了六倍,增加了冗余性,这样在深度可分离卷积之后再进行非线性激活就不会出现太多的信息损失。
mobilenet v3
亮点:
1、使用了网络架构搜索来搜索最优结构
2、使用了一些小技巧精简模型
总体来说,理论上并没有什么突破,只是在小细节上进行了优化处理(感觉大部分还是试出来的)
网络设计:
1、使用了Platform-Aware NAS进行了全局网络搜索,又使用了NetAdapt算法对局部进行了微调(这部分不太了解,也没卡来试)。
2、对瓶颈层做了修改,将1*1卷积移到了平均池化层之后,减小了计算资源的消耗,同时削减了一些层,改动如下:
3、对网络的头部做了修改,作者认为开始时的边缘提取所用的滤波器是互为镜像的,因此将通道数减了一半。
4、将非线性激活函数改为了h-swish用来逼近swish,为了降低对计算资源的消耗,仅在后面部分使用。
5、使用了SENet的网络结构,如下所示: