一:复杂网络模型移植问题
移植难点:
- 很多嵌入式,手机端无法使用庞大的网络结构
- 一个几百M的模型难以随便移植
- 复杂网络的参数和计算量庞大,难以DIY后强加训练,预期效果不尽人意
那么一个简洁时效的网络结构该如何设计呢,答案就是模型的剪枝策略。其实,剪枝和策略是两种侧重点不同的方法,前者是对较为冗长的网络结构进行训练后的删减简化,而后者则是直接设计出轻巧、高移植性的网络架构。本文针对Mobilenet重点讲解网络设计策略。
二:模型剪枝策略
1.剪枝
有关剪枝的具体细节可以参考本人另一篇文章
2.网络设计策略
几种常见的策略:
-
Feature map的channels聚类
对特征图每个通道的γ权重值聚类,如上图聚成四个簇。接着用每一个簇中心的权重值代替特征图,达到剪值效果。 -
ensembling networks Learning
借鉴类似随机森林的集成思想,首先用大量数据训练出N个网络集成的大型网络,将训练出的标签结果作为small net的目标标签(先验值),学起来的话会更容易,而且不易过拟合,可以理解为一群学长将自己几年的学习经验先分享给了你,那么直接对着他们的话学起来,自然就轻松许多,也会少走很多弯路(不易过拟合)。 -
类似SVD的网络分解法
一种类似与奇异值分解的思想,如上图举例,在长度N和M层之间插入一个长度k的线性层,那么原本的param由M×N变成了M×K+N×K,肉眼可见的参数量减少。
上述几种老早提出的模型架构设计方法,效果都不尽人意,接下来我们的主角登场了。
三:Mobilenet v1的横空出世
上图是YOLO_v3目标检测模型在手机端的运行结果,时效性和准确度都达到了预期要求。那么为什么相对庞大的检测算法能如此轻易地移植到手机端呢?正是因为他们将YOLO_v3中的backbone替换成了Mobilenet_v1,替代了常用的Resnet和VGG作为backbone,降低了模型的复杂度,参数量和计算量大大减少。
下面我来讲讲Mobilenet_v1的思想,首先从经典卷积计算讲起:
传统的卷积就是一个filter对特征图的每个通道都进行卷积,虽然能融合不同通道的信息,却增加了计算量,拿下面的模型举例:
可见经典卷积所需计算量巨大,所以Mobilenet_v1提出了Depthwise卷积概念,每一个filler只对一层channel卷积计算,所以说input的通道数等于output的通道数,如下图所示:
那么输出和输入是对应的,怎么能扩展通道数呢,这里Mobilenet_v1又提出了Pointwise卷积概念,实际上就是通过Conv 1*1卷积,扩大了通道数,没什么特殊的,如下图所示:
综上所述,Mobilenet_v1实际上就是depthwise卷积 + Pointwise卷积 的组合,作者又将他们整合成一个叫Depthwise Seperable卷积,整个Mobilenet_v1的核心步骤可用下图表示出:
Mobilenet_v1中其实还提出了一种新的激励函数ReLU6,当x超过6后y不再改变,增加了非线性与泛化能力,同时降低了梯度爆炸的风险。如下图:
最后,我们来看看参数量和计算量到底减少了多少,空口无凭,上图!
四:Mobilenet v2大杂烩
延用Mobilenet_v1中的可分离卷积,v2版本主要对架构进行了修改,主要是如下两点:
- 整体网络架构改变,借鉴Resnet思想,设计了反残差网络,也就是Shotcut模块。
- Relu激活函数改变,用线性替代
通过研究发现,ReLU对低维数据影响很大,部分数据会丢失,但对于高维数据,则没太大影响。
所以作者改变了v1中先depthwise后1×1卷积扩通道的架构,而是选择先1×1卷积扩大维度,后depthwise的架构,实验表明各效果相对于v1都有所提升。如下图所示:
其实这种架构,就是类似于将Resnet中的bottleneck思想反过来运用,先窄后宽— >先宽后窄。Shotcut模块如下图所示:
下面贴上Mobilenet_v2的整体结构框图,供大家参考学习:
对比实验结果:
五:Mobilenet v3完全体
借鉴Mobilenet_v2中的Shotcut结构的思想,v3版本又提出了SE结构,主要是如下两点:
- 引入Squeeze-Excitation结构
- 非线性变换改变,h-swish替代swish
SE-net其实就是将注意力机制引入到了特征图通道中来,先是S操作得到各channel的上下文全局信息,而后E操作,得到各通道权重,最后Fuse加权到特征图中。具体操作不再赘述,如下图所示:
SE-net可以和很多经典模型融合,如下图所示:
至于hard-swish并不是那么重要,直接贴图:
至此,v1-v3的结构全部讲完,最后贴上我们的Mobilenet_v3完全体的网络结构:
(exp size:bneck模块中neck的宽度,NL:非线性方法ReLU或hard-Swish)
效果分析:
至此我对Mobilenet模型v1-v3版本,进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。
我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾!