【研一小白论文精读】MobileNet

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

初衷就是为了服务移动端,由谷歌团队在2017年提出。

Depthwise Convolution(大大减少运算量和参数量)

传统卷积

在这里插入图片描述
卷积核channel=输入特征矩阵channel
输出特征矩阵channel=卷积核个数
在默认stride为1的情况下,普通卷积的计算量(参数个数)是:
在这里插入图片描述
卷积核的长x卷积核的宽x输入特征矩阵的通道数x输出特征矩阵的通道数(卷积核个数)x输入特征矩阵的长x输入特征矩阵的宽

DW卷积(Dephwise Conv)

在这里插入图片描述
1.每一个卷积核channel均为1,并不像传统卷积一样,卷积核深度等于特征矩阵的深度,这里每个卷积核只负责和输入特征矩阵一个channel做卷积运算然后得到输出的一个feature map。
2.输入特征矩阵channel=卷积核个数=输出特征矩阵channel。如图所示,三部分都一样。

PW卷积(Pointwise Conv)

在这里插入图片描述
PW卷积其实就是普通的卷积,只不过卷积核的大小为1。

Depthwise Separable Conv

深度可分卷积,就是由以上两部分构成。
在默认stride为1的情况下,DW卷积+PW卷积的计算量(参数个数)是:
PW的输入特征矩阵等于DW的输出特征矩阵
在这里插入图片描述
最后将深度可分卷积的计算量和普通卷积的计算做对比:
在这里插入图片描述
理论上普通卷积的计算量是DW+PW的8到9倍。

增加超参数α,β

在这里插入图片描述
一个是控制卷积核个数的超参数α,另一个是控制输入图像大小的β,这两个超参数并不是学到的而是人为去设定的。
α取1.0准确率为70.6,当α取0.75,也就是卷积核个数缩减为原来的0.75倍准确率为68.4%,后面对应计算量和模型参数,所以我们发现在α变化,准确率没下降多少的情况下,模型参数下降了很多。
在这里插入图片描述
β第二个超参数控制分辨率,不同的输入图像尺寸对于准确率,模型计算量,参数量。首先对于224224的RGB图像准确率是70.6,当输入图像大小为192192的RGB图像上准确率为69.1,以此类推,我们可以适当缩小输入图片的大小,牺牲一点准确率的情况下大幅降低模型计算量。

MobileNet V1

在这里插入图片描述
根据模型结构其实类似于vgg网络,就是将一系列的卷积做串联。
在这里插入图片描述
在准确率只下降百分之1的情况下,模型参数只有原来的1/32.

MobileNetV2: Inverted Residuals and Linear Bottlenecks

很多人发现,在MobileNetV1中DW卷积的过程中,他的部分卷积核会废掉,因为在观察DW卷积核参数中大部分参数都是等于0的,针对这个问题,作者又提出了MobileNetV2。

Linear Bottlenecks

想把网络做小没问题,但是ReLU一定要放在很高维度的地方才行。
在这里插入图片描述
在倒残差结构中最后一个1*1的卷积层当中,使用了线性的激活函数,而不是之前一直使用的ReLU激活函数。在原论文中,作者做了一个实验,在原来输入的二维矩阵中,channel是等于1的,然后采用不同维度的Tmatrix对他进行一个变换,变换到一个更高的维度上,然后计算出一个输出值,然后再用Tmatrix的逆对他进行一个还原。当维度为2和3时,是丢失了一些信息的,但是随着din的不断增加,丢失的信息就越来越少了。所以最后得出的结论就是ReLU激活函数对低维特征信息会造成更多的损失,高维特征信息造成的损失很小,而在倒残差结构中是一个两边细中间粗的一个结构,所以最后出来的是一个低维的特征,所以我们就使用一个线性结构来替代ReLU激活函数,来减小损失。

Inverted Residuals(倒残差结构)

在这里插入图片描述
(a)是一个简单的平平无奇的卷积操作,把原来的channel逐渐变深。
(b)就是在MobileNetV1中将普通的卷积拆成两个部分,一个是DW对每一个channel内部相邻的区域做卷积,一个是PW把每一个channel全部串接起来。
总之上面两种channel的数量是不断增加的,但是我们希望在做ReLU的时候尽量在高维的空间里面做,那么(b)在之后的发展中就变成了(c),如图(c),第三层打了斜线说明这一层后面并没有激活函数,也就是从这一层到后面这一层,他的变换是完全线性的,那么这样一个结构叫做bottleneck convolution,把很高的维度缩到了一个较低的维度,再把这个低维度再扩到很高的维度,那么这个较低的维度就被称之为linear bottleneck,因为他是没有激活函数的。因为这样的结构是一层一层叠起来的,假如我们换一个起始点的位置,把这层最薄的bottleneck放在起始点,这样串接起来,这样的结构和左边的结构是等效的,就把这个结构(d)称之为expansion convolution bottleneck。
(d)从bottleneck出来,先是将低channel的tensor搞到高channel的tensor上去,所以下面一样把残差的结构代入进来。
在这里插入图片描述
不同于传统的Residual block,本文中直接在bottleneck这个channel数最小的地方来做skip connection。
(a)正向残差结构:两头大中间小
11卷积降维
3
3卷积
11卷积升维
(b)倒残差结构:ReLU6
1
1卷积升维
33卷积DW
1
1卷积降维
在这里插入图片描述
当stride=1输入特征矩阵与输出特征矩阵shape相同时才有shortcut连接。

Searching for MobileNetV3

先直接上实验结果
在这里插入图片描述
明显V3比V2更高效,更省时间。

更新Block(bneck)

在原来倒残差结构的基础上进行了一个简单的改动。
在这里插入图片描述
1.加入了SE模块(注意力机制),这里的注意力机制也非常简单,就是把特征矩阵每一个channel进行一个池化处理,然后在通过两个全连接层得到输出的向量,这个向量其实就是一个权重参数。
在这里插入图片描述
假设特征矩阵是两个通道的,然后采用一个平均池化的操作取均值,因为是两个通道的,所以就到了元素个数为2的一个向量,然后经过两个全连接层得到输出,首先对于FC1的节点个数应该是输入特征矩阵channel的四分之一,这里是举个例子,因为在实际过程中,channel是很多的,不会说会小于4。第二个FC2的节点个数等于特征矩阵的channel,所以在这里他的节点个数是等于2的,然后就得到了有两个元素的向量,每个元素就针对每一个channel对应的权重,比如向量中第一个元素的值是0.5,那么就用0.5乘上第一个channel中所有的元素。
2.更新了激活函数
NL表示非线性激活函数的意思,后面的1*1降维的卷积层是没有使用激活函数的。
swish激活函数计算求导都很复杂,对量化过程不友好
在这里插入图片描述
参考之前对ReLU激活函数的修改其实只是增加了一个上限6,所以h-sigmoid激活函数如下图:
在这里插入图片描述
在这里插入图片描述
如图,h-sigmoid和原始的sigmoid还是比较接近的。而h-swish激活函数
在这里插入图片描述
在这里插入图片描述
同样swish和h-swish也很像。
在原文中,作者说把sigmoid替换成h-sigmoid,把swish替换成h-swish,对量化过程也是非常友好的。

使用NAS搜索参数(Neurl Architecture Search)

重新设计耗时层结构

再作者使用NAS搜索之后得到的网络,对网络的每一层的一个推理时间进行了分析,然后针对某些耗时的层结构进行了优化。
1.减少第一个卷积层的卷积核个数(32->16)
在这里插入图片描述
减少一半的卷积核准确率是没有变化的,但是时间减少了2毫秒。
2.精简Last Stage
在这里插入图片描述
在使用NAS搜索出来的网络最后一个部分叫做Original Last Stage,作者说这个部分是一个比较耗时的一个部分,那么作者就针对这个结构进行了一个精简,就是Efficient Last Stage,明显少了很多层结构,作者说在准确率上是没有什么变化的,但是节省了7ms的执行时间,这7ms占了整个推理过程的百分之11.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值