暑假有个实验作业是行人检测,这个其实有现有的模型,coco就有一个官方训练出来的caffemodel,效果也是挺不错的,但老师希望我们自己搭网络进行实现,其中向我们推荐了轻量级神经网络MobileNet,但对此不是很了解。于是就开始去各种博客进行学习,以下是学习记录。
文末会附上学习时参考的博客链接。
MobileNet模型结构
深度可分离卷积
MobileNet是一种轻量级的神经网络,更适合用于移动端和嵌入式端深度学习应用,力争在cpu上也达到比较好的识别速度效果。
通常来说,标准的卷积过程也就是,一个m×m的卷积核在卷积的时候,对应图像区域中的所有通道均被同时考虑,但实际上,我们并不一定需要同时考虑区域和通道,也可以分开考虑。深度可分离卷积则提出了这种新的思路,对于不同的输入通道采取不同的卷积核进行卷积。而MobileNet模型则是基于深度可分离卷积的结构,它可以将标准卷积分解成一个深度卷积和一个点卷积(1*1卷积核)。
假设有N×H×W×C(N:样本数,H:高度,W:宽度,C:通道数)的输入,Depthwise过程是指将N×H×W×C的输入分为C组,然后每一组做3×3卷积,这样就相当于收集了每个通道的空间特征;随后,Pointwise过程对N×H×W×C的输入做k个普通的1×1卷积,这样就相当于收集了每个点的特征。Depthwise+Pointwise最终输出也就是N×H×W×k。
来个实际的例子:
假如说,输入通道为16,希望输出通道为32,那么,过程是,①用16个3×3大小的卷积核分别与输入的16通道的数据做卷积,这里的卷积核是1通道的,而输入数据的每个通道都用1个3×3的卷积核进行卷积,这样就得到了16个通道的特征图,在叠加16个特征图之前,②用32个1×1大小的卷积核(16通道)在这16个特征图进行卷积运算,将这16个通道的信息进行融合,也就是说,我们用了1×1的卷积核进行了不同通道见的信息融合。以上两个过程分别是Depthwise和Pointwise的。整个过程下来,一共使用了3×3×16+(1×1×16)×32=656个参数。而如果使用原来的标准卷积的话,一般的操作就是用32个3×3的卷积核来分别同输入数据卷积,并且得到的输出是只有一个通道的数据,那么一共就是(3×3×16)×32=4068个参数。
从上也可以看出,深度可分离卷积比标准卷积减少了所需要的参数,极大地减少了计算量,也没有怎么影响到准确率。
它有一个对应的计算量的公式,如果通过Depthwise+Pointwise的拆分,相当于将普通卷积的计算量压缩为:
模型结构
MobileNets结构建立在深度可分离卷积中(但它第一层是标准卷积)。MobileNet目前为止一共有v1、v2、v3三个版本,依次介绍。
MobileNet v1
MobileNet v1的架构如下:
可以看到,除了最后的全连接层,所有层后面都跟了batchnorm和ReLU,最终输入到softmax进行分类。一共是28层。
MobileNet v2
MobileNet v2是对v1的改进,v1的结构很简单,但性价比不高,后续一系列的ResNet,DenseNet等结构已经证明通过复用图像特征,使用Concat/Eltwise+等操作进行融合能够极大提升网络的性价比。
除此之外,Depthwise Conv虽然降低了计算量,但是在实际使用的时候,训练完后Depthwise训出来的kernel(核)有不少是空的,也就是说,有可能Depthwise每个kernel dim相对于普通的Conv小得多,在**函数(ReLU)的影响下,神经元输出很容易变成0,那就意味着学废了。
MobileNet v2的创新点
Inverted Residual Block(逆残差结构)
首先先了解一下残差网络,之前用Pytorch跑CIFAR-10数据集的时候搭过18层的ResNet,这里附上当时做的学习笔记:
参考博客:https://blog.csdn.net/dulingtingzi/article/details/79870486
有的时候网络层数增多了但是学习后的错误率反而提高了,但是按道理来说,模型的深度加深后,学习的能力会相应地增强,不应当产生比它更浅的模型更高的错误率。这个“退化”问题产生的原因归结于优化难题,当模型变得复杂时,优化器的优化会变得困难,导致了模型达不到好的学习效果
针对这个问题,提出了一个Residual结构:
也就是增加一个恒等映射,将原来需要学的函数H(x)转换成F(x)+x,两个函数表达的效果相同,但是在优化的难度上,后者会比前者简单
Residual block通过shortcut connection实现,通过shortcut将block的输入和输出进行加叠。残差网络借鉴了高速网络的跨层连接思想:
假定某段神经网络的输入是x,期望输出是H(x),如果已经学习到较饱和的准确率,那么接下来的学习目标就转变为恒等映射的学习,也就是使得输入x近似于输出H(x),以保持在后面的层次中不会造成精度的下降。在结构图中,shortcut connections直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0的时候H(x)=x,那么ResNet相当于改变了学习的目标,它学习的是目标值H(x)和x的差值,也就是所谓的残差F(x):=H(x)-x,因此,后面的训练目标就是将残差结果逼近于0,使得随着网络的加深准确率不下降
注:在shortcut connections中,如果通道相同,采用的计算方式为H(x)=F(x)+x,如果不同,采用的计算方式为H(x)=F(x)+Wx,其中W是卷积操作,用于调整x维度
作者通过实验证明了,这个加法不会给网络增加额外的参数和计算量,但是可以大大增加模型的训练速度、提高训练效果,并且当模型的层数加深的时候,能够解决退化问题
作者搭建了18、34、50、101、152层的ResNet分别进行了实验,结果发现随着层数的增多,错误率大大降低,计算的复杂程度也不高
原始的ResNet Block是:先用1×1降通道过ReLU(目的是减少计算量),再3×3空间卷积过ReLU,再1×1卷积过ReLU恢复通道,最后和输入相加。
但MobileNet v2的Inverted Residual Block与之不一样,中间的3×3卷积变为了Depthwise的了,计算量已经减少了,所以先通过1×1卷积提升通道数,再Depthwise的3×3空间卷积,再1×1卷积降低维度。
ReLU6
ReLU6就是普通的ReLU但是限制最大输出值为6,这样在移动端设备float16/int8的低精度的时候也能有很好的数值分辨率。这一非线性**方法在MobileNet v1中已经实现。
MobileNet v2提出,将最后的输出ReLU6去掉,直接线性输出,因为,ReLU变换后保留非0区域对应于一个线性变换,仅当输入低维时ReLU能保留完整信息。
模型结构
如下图所示:
t是输入通道的倍增系数,n是重复次数,c是输出通道数,s是该模块第一次重复时的stride。
Conv2d和avgpool最大的特点是bottleneck,由下面三个部分构成:
论文中给出了在ImageNet上的准确率:
并且,在目标检测任务上,基于MobileNet v2的SSDLite在COCO数据集上超过了YOLO v2
MobileNet v3
MobileNet v3没有引入新的Block。它有两个版本,MobileNet v3-Smal和MobileNet v3-Large分别应对计算和存储要求低和高的版本。
MobileNet v3 创新点
MobileNet v3 block
MobileNet v3的网络块结构与v2的有部分区别,如下图所示:
这种结构综合了三种模型的思想:MobileNet v1的深度可分离卷积,MobileNet v2的逆残差结构,MnasNet的基于squeeze and excitation结构的轻量级注意力模型。这样一来,MobileNet v3模块变得更加高效。
互补搜索技术组合
在网络结构搜索中,作者结合了两种技术:资源受限的NAS和NetAdapt,前者用于在计算和参数受限的前提下搜索网络的各个模块,后者用于对各个模块确定之后网络层的微调。简单来说,前者是整体式的结构搜索,后者是局部式的,两者互为补充。
网络结构的改进
MobileNet v3在平均池化前的层移除并用1×1卷积来计算特征图。这样既能提速又能减少操作数。
作者发现一种新的**函数swish x能有效改进网络精度:
但这个方法的计算量太大了,于是他做了数值近似的改进:
网络结构
MobileNet v3-Large:
MobileNet v3-Small:
作者也给出了最终结果,ImageNet分类上的准确度与MobileNetV2相比提高了3.2%,同时延迟降低了15%。目标检测上,在COCO数据集上检测精度与MobileNetV2大致相同,但速度提高了25%。在Cityscapes语义分割任务中,新设计的模型MobileNetV3-Large LR-ASPP 与 MobileNetV2 R-ASPP分割精度近似,但快30%。
以上就是我的学习记录,下面附上参考的博客链接:
mobilenet网络的理解:https://blog.csdn.net/wfei101/article/details/78310226
卷积原理:几种常用的卷积(标准卷积、深度卷积、组卷积、扩展卷积、反卷积):https://blog.csdn.net/chenyuping333/article/details/82531047?utm_source=blogxgwz6
轻量级模型:MobileNet V2:https://blog.csdn.net/kangdi7547/article/details/81431572
轻量化网络:MobileNet-V2:https://blog.csdn.net/u011995719/article/details/79135818
重磅!MobileNetV3 来了!:https://www.jiqizhixin.com/articles/2019-05-09-2
【论文学习】轻量级网络——MobileNetV3终于来了(含开源代码):https://blog.csdn.net/DL_wly/article/details/90168883