MobileNet网络模型主要是基于现有的大部分网络模型,都可以通过使用更深的网络结构,更多的训练参数,更多的计算资源来获得更高的精确度,但这种网络模型难以在移动端或者嵌入式系统中使用,例如智能手机,车辆自动驾驶导航系统等等,为了解决这个问题,作者提出了MobileNet模型,在尽量不降低精确度的基础上,尽可能减少计算量以及训练参数数目,目前已经发布了V1和V2两个版本,V2在V1的基础上进行了改良,两者的基本思路是一致的。
MobileNet V1中,作者首先提及了,一个标准的卷积层,对于的输入图像,卷积层的参数为,最后得到的输出特征为,其中涉及的计算量就是,为了减少计算量,作者提出了,将一个标准的卷积层操作分成两步,第一步进行特征提取,主要影响输入图像的原始尺寸(DepthWise Conv),第二步进行维度变换,主要影响输入图像的通道数(PointWise Conv)。
DW和正常的卷积操作不同,DW使用了一个的卷积核,而对于一个输入图像,首先将它按照每个通道的顺序,分成个的输入,然后依次用卷积核对这些输入进行卷积,生成个的输出,再将这个输出按顺序整合到一个Tensor里,得到的最终输出,计算量为,我们可以发现,在这个过程中,从输入到输出,其实只是输入的“高”和“宽”发生了变化,它的“通道数”并没有变。
PW和正常的卷积操作基本一致,只是换了一个的卷积核尺寸,对于从DW得到的输入,PW的卷积层参数是,最后得到的输出是,与标准卷积层的输出一致,这步操作的计算量是,我们可以发现,在这个过程中,从输入到输出,其实只是输入的“通道数”发生了变化,它的“宽”和“高”并没有变,可以理解成一个维度变换的操作。
两步的计算量合计是,相比原始的计算量,少了几乎一个量级。
作者一般使用的卷积核尺寸为,一个完整的DW+PW操作如下图:
左边是传统的卷积层操作,右边是DW+PW分解的卷积层操作,注意DW和PW是两步分开的操作,可以算是经过两次卷积,所以输出都要通过一个BatchNorm以及非线性激活函数ReLU。
MobileNet V1完整的网络结构如下:
可以看见,第一层依旧是一个传统的卷积层,之后经历了9个DW+PW的卷积层,然后经过平均池池化,经过全连接层,最后经由Softmax分类器,输出概率结果。
值得注意的是,MobileNet同样有两个可以调整的超参数,一个是Width Multiple,用于降低输入图像的通道数,将信息压缩到更低维的空间中,这个参数以1.0为基准,参数越小,图像通道数压缩的越小,网络精确度越低,但相对的,计算量和训练参数数目也会更低;第二个参数是Resolution Multiple,用于缩放图像分辨率,比如将一个的图像,压缩成,这个参数以1.0为基准,参数越小,图像分辨率压缩的越低,网络精确度越低,同样,会换来更低的计算量与训练参数数目。简单来说,我们可以通过调整超参数,来调整我们的模型,对于更小,计算资源更紧张的移动端,我们下调两个超参数,牺牲一定的准确率,换取非常低的计算量,根据实际需求,调整参数,调整网络模型大小。下面是作者给出的两个超参数的调节table:
接下来是MobileNet V2,V2是在V1的基础上,进行了一定的改良,实际上的思路是一致的,作者提出了一个bottleneck block的模块,这个模块就是对V1的DW+PW进行了改进,基于前者存在的一定问题:作者认为,正如之前所说,V1网络存在一个超参数Width Multiple,可以降低通道数,将输入的信息压缩到更低维的空间中,但当这些信息通过一个非线性激活函数ReLu的时候,由于负数归零,会损失较多的信息,于是作者将原本接收DW输出作为输入的PW层的ReLU去掉,同时引入了一个“颠倒”的类似深度残差网络的结构。
简单来说,一个bottleneck block由三层卷积层组成:PW+DW+PW(Without ReLU),第一个PW对输入信息进行提高维度操作,然后DW在更高的维度进行特征信息提取,之后通过一个PW把维度再降低回来,因为作者认为,较低维度的信息通过ReLU会损失较多,所以第二个进行降维操作的PW是不使用ReLU的,作者提供了具体的bottleneck block结构:
可以发现,里面作者提供了一个超参数,膨胀率,这个参数的数值越高,中间DW层提取特征的维度就越高,理论上精确度会越高,但会导致中间训练参数增加,计算量增大,可以看见对一个的输入,bottleneck block会根据DW的层的步长和设定的输出通道数,输出。
完整的MobileNet V2的网络模型如下:
关于这个作者在论文中给出的网络模型,其实是存在问题的,我也参考了很多其余csdn博客主的文章,还是觉得可能是作者写错了,首先上面的四个参数依次代表着膨胀率,输出通道数,层重复次数和步长,作者在论文中提到一共用了十九个bottleneck层,但这个图上只有十七层,其余没有问题。可以看见,输入图像首先通过一个普通的卷积层,然后通过十七个bottleneck层,在经过一个普通的卷积层,然后经过平均池层池化,最后经过一个卷积层进行输出,该网络模型中,如果没有特意标注卷积核的尺寸,一律默认为。