MobileNet网络模型学习笔记

MobileNet网络模型主要是基于现有的大部分网络模型,都可以通过使用更深的网络结构,更多的训练参数,更多的计算资源来获得更高的精确度,但这种网络模型难以在移动端或者嵌入式系统中使用,例如智能手机,车辆自动驾驶导航系统等等,为了解决这个问题,作者提出了MobileNet模型,在尽量不降低精确度的基础上,尽可能减少计算量以及训练参数数目,目前已经发布了V1和V2两个版本,V2在V1的基础上进行了改良,两者的基本思路是一致的。

MobileNet V1中,作者首先提及了,一个标准的卷积层,对于h_{i}\times w_{i}\times d_{i}的输入图像,卷积层的参数为k_{i}\times k_{i}\times d_{i}\times d_{j},最后得到的输出特征为h_{j}\times w_{j}\times d_{j},其中涉及的计算量就是h_{i}\times w_{i}\times k_{i}\times k_{i}\times d_{i}\times d_{j},为了减少计算量,作者提出了,将一个标准的卷积层操作分成两步,第一步进行特征提取,主要影响输入图像的原始尺寸(DepthWise Conv),第二步进行维度变换,主要影响输入图像的通道数(PointWise Conv)。

DW和正常的卷积操作不同,DW使用了一个k_{i}\times k_{i}\times 1\times 1的卷积核,而对于一个输入图像h_{i}\times w_{i}\times d_{i},首先将它按照每个通道的顺序,分成d_{i}h_{i}\times w_{i}\times 1的输入,然后依次用卷积核k_{i}\times k_{i}\times 1\times 1对这些输入进行卷积,生成d_{i}h_{j}\times w_{j}\times 1的输出,再将这d_{i}个输出按顺序整合到一个Tensor里,得到h_{j}\times w_{j}\times d_{i}的最终输出,计算量为h_{i}\times w_{i}\times d_{i}\times k_{i}\times k_{i},我们可以发现,在这个过程中,从输入到输出,其实只是输入的“高”和“宽”发生了变化,它的“通道数”并没有变。

PW和正常的卷积操作基本一致,只是换了一个1\times 1的卷积核尺寸,对于从DW得到的输入h_{j}\times w_{j}\times d_{i},PW的卷积层参数是1\times 1\times d_{i}\times d_{j},最后得到的输出是h_{j}\times w_{j}\times d_{j},与标准卷积层的输出一致,这步操作的计算量是h_{i}\times w_{i}\times d_{i}\times d_{j},我们可以发现,在这个过程中,从输入到输出,其实只是输入的“通道数”发生了变化,它的“宽”和“高”并没有变,可以理解成一个维度变换的操作。

两步的计算量合计是h_{i}\times w_{i}\times d_{i}\times(k_{i}\times k_{i}+d_{j}),相比原始的计算量,少了几乎一个量级。

作者一般使用的卷积核尺寸为3\times 3,一个完整的DW+PW操作如下图:

左边是传统的卷积层操作,右边是DW+PW分解的卷积层操作,注意DW和PW是两步分开的操作,可以算是经过两次卷积,所以输出都要通过一个BatchNorm以及非线性激活函数ReLU。

MobileNet V1完整的网络结构如下:

可以看见,第一层依旧是一个传统的卷积层,之后经历了9个DW+PW的卷积层,然后经过平均池池化,经过全连接层,最后经由Softmax分类器,输出概率结果。

值得注意的是,MobileNet同样有两个可以调整的超参数,一个是Width Multiple,用于降低输入图像的通道数,将信息压缩到更低维的空间中,这个参数以1.0为基准,参数越小,图像通道数压缩的越小,网络精确度越低,但相对的,计算量和训练参数数目也会更低;第二个参数是Resolution Multiple,用于缩放图像分辨率,比如将一个224\times 224的图像,压缩成192\times 192,这个参数以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结构:

可以发现,里面作者提供了一个超参数,膨胀率t,这个参数的数值越高,中间DW层提取特征的维度就越高,理论上精确度会越高,但会导致中间训练参数增加,计算量增大,可以看见对一个h\times w\times k的输入,bottleneck block会根据DW的层的步长s和设定的输出通道数k{}',输出\frac{h}{s}\times \frac{w}{s}\times k{}'

完整的MobileNet V2的网络模型如下:

关于这个作者在论文中给出的网络模型,其实是存在问题的,我也参考了很多其余csdn博客主的文章,还是觉得可能是作者写错了,首先上面的四个参数依次代表着膨胀率,输出通道数,层重复次数和步长,作者在论文中提到一共用了十九个bottleneck层,但这个图上只有十七层,其余没有问题。可以看见,输入图像首先通过一个普通的卷积层,然后通过十七个bottleneck层,在经过一个普通的卷积层,然后经过平均池层池化,最后经过一个卷积层进行输出,该网络模型中,如果没有特意标注卷积核的尺寸,一律默认为3\times 3

猜你喜欢

转载自blog.csdn.net/qq_41174201/article/details/88421646