本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,MobileNet,ShuffleNet,EifficientNet,Vision Transformer,Swin Transformer,Visual Attention Network,ConvNeXt, MLP-Mixer,As-MLP,ConvMixer,MetaFormer
MobileNet 系列文章目录
前言
MobileNet系列是由谷歌公司的Andrew G. Howard等人于2016年提出的轻量级网络结构,并于2017年发布在arXiv上。MobileNet系列的特点是模型小、计算速度快,适合部署到移动端或者嵌入式系统中。相较于后期的巨型、难以训练的模型(如Transformer),MobileNet系列在卷积神经网络中是轻量级网络的经典。MobileNet对嵌入式设备非常友好。原作者团队后续对模型进行了进一步改进,先后提出了MobileNet V2和MobileNet V3版本,与GoogLeNet类似,MobileNet也是一系列文章。
MobileNet V1:https://arxiv.org/abs/1704.04861
MobileNet V2:https://arxiv.org/pdf/1801.04381
MobileNet V3:https://arxiv.org/abs/1905.02244
视频讲解:https://www.aideeplearning.cn/mcv_lesson/969/
注意:本文引用自Venus AI网站(www.aideeplearning.cn),更多AI知识请参考原站。
一、MobileNetV1
卷积神经网络(Convolutional Neural Networks,CNN),后简称为CNN,已经广泛应用于计算机视觉领域,并且取得了不错的效果。然而近年来CNN在ImageNet竞赛中为了追求更高的分类准确度,模型深度越来越深,模型的深度和复杂度也随之增加,如深度残差网络(ResNet)其层数已经多达152层。然而,在某些真实的应用场景,如移动或者嵌入式设备,如此庞大而复杂的模型是难以被应用的。
首先,这些场景面临内存不足的问题,因为模型过于庞大。其次,这些场景要求低延迟,换而言之就是响应速度要快,想象一下自动驾驶汽车的行人检测系统如果相应速度太慢会发生什么可怕的事情。因此,研究小而高效的CNN模型在这些场景中非常重要。
目前的研究可以归纳为两个方向:第一是对已经训练好的复杂模型进行压缩以得到小型模型,即模型量化;第二是直接设计小型模型并进行训练。无论哪种方法,其目标都是在保持模型准确度(Accuracy)的前提下降低模型参数量(Parameters Size),同时提升模型速度。
本文的主角是MobileNet系列的网络,这是Google最近提出的一种小巧而高效的CNN模型,它在准确度和延时性之间做出了折中。下面将详细介绍MobileNet。
1.深度可分离卷积
MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分。
![对AelxtNet各层占用的计算时间分析](https://i-blog.csdnimg.cn/blog_migrate/079ed3de921cce0612c4342a33db6d8d.png)
如上图所示,模型推理中卷积操作占用了大部分的时间,因此MobileNetV1使用了深度可分离卷积对卷积操作做了进一步的优化,具体解释如下:
常规卷积操作
对于5x5x3的输入,如果想要得到3x3x4的feature map,那么卷积核的shape为3x3x3x4;如果padding=1,那么输出的feature map为5x5x4,如下图:
![常规的卷积计算过程](https://i-blog.csdnimg.cn/blog_migrate/737a5fe37b2f6b5e13617672073b5e44.png)
卷积层共4个Filter,每个Filter包含一个通道数为3(与输入信息通道相同),且尺寸为3×3的kernel。因此卷积层的参数数量可以用如下公式来计算(即:卷积核W x 卷积核H x 输入通道数 x 输出通道数):
N_std = 4 × 3 × 3 × 3 = 108
计算量可以用如下公式来计算(即:卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数 x 输出通道数):
C_std =3*3*(5-2)*(5-2)*3*4=972
深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。
逐通道卷积(Depthwise Convolution)
Depthwise Convolution的一个卷积核只有一个通道,输入信息的一个通道只被一个卷积核卷积,这个过程产生的feature map通道数和输入的通道数完全一样,如下图所示:
![Depthwise Convolution的卷积计算过程](https://i-blog.csdnimg.cn/blog_migrate/9f958adaf7bde6188f3c2dbaf811cde4.png)
一张5×5像素、三通道彩色输入图片(shape为5×5×3),Depthwise Convolution每个卷积核只负责计算输入信息的某一个通道。卷积核的数量与输入信息的通道数相同。所以一个三通道的图像经过运算后一定是生成了3个Feature map。卷积核的shape即为:(卷积核W x 卷积核H x 输入数据的通道数C)。
此时,卷积部分的参数个数计算如下( 卷积核Wx卷积核Hx输入通道数),即:
N_depthwise = 3 × 3 × 3 = 27
计算量为( 卷积核W x 卷积核H x (图片W-卷积核W+1) x (图片H-卷积核H+1) x 输入通道数)即:
C_depthwise=3x3x(5-2)x(5-2)x3=243
Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法在通道维度上扩展或压缩Feature map的数量。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的features的相关性。简而言之,虽然减少了计算量,但是失去了通道维度上的信息交互。因此需要Pointwise Convolution来将这些Feature maps进行组合生成新的Feature maps。
逐点卷积(Pointwise Convolution)
Pointwise Convolution的运算与常规卷积运算非常相似,其实就是1X1的卷积。它的卷积核的尺寸为 1×1×M,M为上一层输出信息的通道数。所以这里Pointwise Convolution的每个卷积核会将上一步的feature maps在通道方向上进行加权组合,生成新的feature map。有几个卷积核就有几个输出多少个新的feature maps。
![Pointwise Convolution的卷积计算过程](https://i-blog.csdnimg.cn/blog_migrate/643d8db11ea6688896dfc64936c0847d.png)
由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为(1 x 1 x 输入通道数 x 输出通道数):
N_pointwise = 1 × 1 × 3 × 4 = 12
计算量则为(1 x 1 特征层W x 特征层H x 输入通道数 x 输出通道数):
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
经过Pointwise Convolution之后,由四个卷积核输出了4张Feature map,与常规卷积的输出维度相同。
参数对比
回顾一下,常规卷积的参数个数为:
N_std = 4 × 3 × 3 × 3 = 108
Depthwise Separable Convolution的参数由两部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39
相同的输入,同样是得到4张Feature map,Separable Convolution的参数个数是常规卷积的约1/3。因此,在参数量相同的前提下,采用Depthwise Separable Convolution的神经网络层数可以做的更深。
计算量对比
回顾一下,常规卷积的计算量为:
C_std =33(5-2)*(5-2)34=972
Depthwise Separable Convolution的参数由两部分相加得到:
C_depthwise=3x3x(5-2)x(5-2)x3=243
C_pointwise = 1 × 1 × 3 × 3 × 3 × 4 = 108
C_separable = C_depthwise + C_pointwise = 351
相同的输入,同样是得到4张Feature map,Separable Convolution的计算量也是常规卷积的约1/3。因此,在计算量相同的情况下,Depthwise Separable Convolution可以将神经网络层数可以做的更深。
2.MBconv
前面讲述了depthwise separable convolution,这是MobileNet的基本操作,但是在真正应用中会加入batchnorm,并使用ReLU激活函数,所以depthwise separable convolution的基本结构如下图右面所示, 左面是正常的conv:
![MBconv](https://i-blog.csdnimg.cn/blog_migrate/c4c408e7a3db54605cd77f6623f578d0.png)
整体网络就是通过不断堆叠MBconv组件组成的,这种深度可分离卷积的操作方式在减少计算量的同时保持了模型的表达能力。
3.Model Architecture
MobileNet的网络结构如表1所示。首先是一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2进行down sampling。经过 卷积提取特征后再采用average pooling将feature变成1x1,根据预测类别大小加上全连接层,最后是一个softmax层。
![MBconv](https://i-blog.csdnimg.cn/blog_migrate/5cbb765775bafe70484507bc9880d758.png)
如果单独计算depthwise convolution和pointwise convolution,整个网络有28层(这里Avg Pool和Softmax层不计算在内)。我们还可以分析整个网络的参数和计算量分布,如下表所示。 可以看到整个模型的计算量和参数量基本集中在1×1卷积上。
![MBconv](https://i-blog.csdnimg.cn/blog_migrate/cbbf7faa03d4ebdcbe0322f8c51100cf.png)
MobileNet到底效果如何,这里与GoogleNet和VGG16做了对比,如Table8所示。相比VGG16,MobileNet的准确度稍微下降,但是优于GoogleNet。然而,从计算量和参数量上MobileNet具有绝对的优势。
![MobileNet Comparison to Popular Models](https://i-blog.csdnimg.cn/blog_migrate/30633b073e409ac64f0af9e7533e9928.png)
最后,MobileNet V1还引入了宽度和分辨率调整系数,分别是宽度乘子(α)和分辨率乘子(ρ),用于调整模型的大小和计算复杂性。
- 宽度乘子(α):宽度乘子是一个介于0和1之间的比例因子。它被应用于模型中的每个卷积层的通道数,以减少模型的宽度。通过降低每个卷积层的通道数,可以减少模型中的参数数量和计算量,从而使模型更轻量化。较小的宽度乘子值(例如0.5)将导致更窄的模型,而较大的值(例如1.0)将保持原始模型的宽度。
- 分辨率乘子(ρ):分辨率乘子是一个介于0和1之间的比例因子。它被应用于输入图像的分辨率,以减少输入图像的尺寸。通过降低输入图像的分辨率,可以减少卷积操作的计算量和内存消耗。较小的分辨率乘子值(例如0.5)将导致输入图像的尺寸减小为原始尺寸的一半,而较大的值(例如1.0)将保持原始尺寸。
通过调整宽度乘子和分辨率乘子,可以灵活地控制MobileNet V1模型的大小和计算复杂度。这对于在计算资源受限的移动设备上进行模型部署非常有用。较小的宽度乘子和分辨率乘子值可以产生更轻量化的模型,适用于资源受限的场景,而较大的值则可以保持模型的原始性能。这使得MobileNet V1可以根据具体应用的需求进行定制化和优化。用户可以根据设备性能和应用场景选择合适的参数,权衡模型精度和速度。
小结
MobileNet V1是一种轻量级的深度学习卷积神经网络(CNN)架构,于2017年由谷歌团队提出。它旨在在移动设备和嵌入式系统上实现高效的图像识别和分类。MobileNet V1的主要特点如下。
- 采用深度可分离卷积(Depthwise Separable Convolution):MobileNet V1采用这种特殊的卷积技术,将传统卷积分解为两个独立操作:深度卷积和逐点卷积。这种方法大幅减少了计算复杂性和参数数量,降低了计算成本和存储需求。
- 引入宽度和分辨率调整系数:MobileNet V1引入了两个超参数,分别是宽度乘子(α)和分辨率乘子(ρ),用于调整模型的大小和计算复杂性。用户可以根据设备性能和应用场景选择合适的参数,权衡模型精度和速度。
- 低延迟、低计算资源占用:由于其轻量化的设计,MobileNet V1在移动设备和嵌入式系统上运行时具有较低的延迟和较少的计算资源占用,适合实时应用和边缘计算。
- 应用广泛:MobileNet V1可用于多种计算机视觉任务,如图像分类、物体检测、语义分割等。其模型结构和参数可根据不同场景进行调整,满足各种需求。
总之,MobileNet V1是一种高效、轻量级的深度学习模型,适用于移动设备和嵌入式系统。其主要特点包括采用深度可分离卷积技术、具有宽度和分辨率调整系数、低延迟、低计算资源占用,以及广泛应用于多种计算机视觉任务。
二、MobileNetV2
Andrew G. Howard 等于 2018 年在 MobileNet V1 的基础上又提出了改进版本 MobileNet V2。具体可以参考原始论文 MobileNetV2: Inverted Residuals and Linear Bottlenecks。
从标题我们就可以看出,V2 中主要用到了 Inverted Residuals 和 Linear Bottlnecks。
1. Inverted Residuals
上一篇我们看到 V1 的网络结构还是非常传统的直桶模型(没有旁路),但是 ResNet 在模型中引入旁路并取得了很好的效果,因此到了 V2 的时候,作者也想引入进来,这就有了我们要探讨的问题了。
首先我们看下ResNet BottleNeck Block。下图可以看到,采用 1x1 的卷积核先将 256 维度降到 64 维,经过 3x3 的卷积这后,然后又通过 1x1 的卷积核恢复到 256 维。
![ResNet BottleNeck Block](https://i-blog.csdnimg.cn/blog_migrate/58adba63b428be44179d0785752eab24.png)
我们要把 ResNet BottleNeck Block 运用到 MobileNet 中来的话,如果我们还是采用相同的策略显然是有问题的,因为 MobileNet 中由于逐通道卷积,本来 feature 的维度就不多,如果还要先压缩的话,会使模型太小了,所以作者提出了 Inverted Residuals,即先扩展(6倍)后压缩,这样就不会使模型被压缩的太厉害。 下图对比了原始残差和反转残差结构:
![residual block and Inverted residual block](https://i-blog.csdnimg.cn/blog_migrate/be25f32a4706b6334d3e4f0806a51aee.png)
Inverted Residual Block的代码实现如下。
1. class MBconv(nn.Module):
2. def __init__(self, in_channels, out_channels, stride, padding):
3. super().__init__()
4. hidden_channel = in_channels * 6
5. self.InvertMBconv = nn.Sequential(
6. nn.Conv2d(in_channels, hidden_channel, kernel_size=1, stride=stride, padding=padding, groups=in_channels),
7. nn.BatchNorm2d(hidden_channel),
8. nn.ReLU(inplace=True),
9. nn.Conv2d(hidden_channel, hidden_channel, kernel_size=3, stride=stride, padding=padding, groups=in_channels),
10. nn.BatchNorm2d(hidden_channel ),
11. nn.ReLU(inplace=True),
12. nn.Conv2d(hidden_channel, out_channels, kernel_size=1, stride=stride, padding=padding),
13. nn.BatchNorm2d(out_channels),
14. nn.ReLU(inplace=True)
15. )
16. def forward(self, x):
17. return self.InvertMBconv(x) + x
2. Linear Bottlnecks
Linear Bottlnecks 听起来很高级,其实就是把上面的 Inverted Residuals block 中的 bottleneck 处的 ReLU 去掉。通过下面的图片对比就可以很容易看出,实际上就是去掉了最后一个 1x1 卷积后面的 ReLU。整体的网络模型就是由堆叠下图右图的Bottlenecks搭建成的
![Linear Bottlnecks](https://i-blog.csdnimg.cn/blog_migrate/13f6faaee0fa381ee53c415218c4204d.png)
那为什么要去掉呢?而且为什么是去掉最后一个1X1卷积后面的 ReLU 呢?因为在训练 MobileNet V1 的时候发现最后 Depthwise 部分的 kernel 训练容易失去作用,最终再经过ReLU出现输出为0的情况。作者发现是因为ReLU 会对 channel 数较低的张量造成较大的信息损耗,因此执行降维的卷积层后面不会接类似于ReLU这样的非线性激活层。说人话就是:1X1卷积降维操作本来就会丢失一部分信息,而加上 ReLU 之后那是雪上加霜,所以去掉 ReLU 缓一缓。
3. Model Architecture
完整的MobileNetV2的网络结构参数如下:
t代表反转残差中第一个1X1卷积升为的倍数;c代表通道数;n代表堆叠bottleneck的次数;s代表DWconv的幅度(1或2),不同的步幅对应了不同的模块,详见上图(d)MobilenetV2。
![Model Architecture](https://i-blog.csdnimg.cn/blog_migrate/2f57f29ec560b67d435d912ef75c1ecc.png)
效果上,在 ImageNet 图像分类的任务中,相比 V1 参数量减少了,效果也更好了,详见下图:
![Model Comparison](https://i-blog.csdnimg.cn/blog_migrate/ef4a3165af0ad29cd9c0809df6fd0bd3.png)
小结
MobileNet V2是Google团队在MobileNet V1基础上提出的升级版轻量级深度学习卷积神经网络(CNN)架构。它在提高性能的同时保持了低计算复杂性和参数数量的优势,适用于移动设备和嵌入式系统。MobileNet V2的主要特点如下。
- 逆残差结构(Inverted Residual Blocks):MobileNet V2引入了一种新的网络结构,将标准的残差结构翻转。这种结构使用轻量级的1×1卷积对输入进行扩张,接着进行3×3深度可分离卷积,最后再用1×1卷积进行压缩。这种设计有助于减小计算成本,同时保持特征表达能力。
线性激活函数:在逆残差结构的输出部分,MobileNet V2使用线性激活函数(而非ReLU等非线性激活函数)。这样做可以减少ReLU导致的信息损失,使特征更好地保存在网络中。 - 调整宽度和分辨率:与MobileNet V1类似,MobileNet V2也使用宽度乘子(α)和分辨率乘子(ρ)这两个超参数调整模型的大小和计算复杂性。这使得用户可以根据设备性能和应用场景进行权衡,平衡模型的精度和速度。
- 高效性能:相比MobileNet V1,MobileNet V2在保持轻量化、低延迟和低计算资源占用的基础上,进一步提升了性能。这使其在多种计算机视觉任务中表现更优,如图像分类、物体检测和语义分割等。
三、MobileNetV3
V3 保持了一年一更的节奏,Andrew G. Howard 等于 2019 年又提出了 MobileNet V3。文中提出了两个网络模型, MobileNetV3-Small 与 MobileNetV3-Large 分别对应对计算和存储要求低和高的版本。具体可以参考原始论文 Searching for MobileNetV3。
这回的标题(Searching for MobileNetV3)说的不是 V3 里面有什么,而是说的 V3 是怎么来的。Searching 说的是网络架构搜索技术(NAS),即 V3 是通过搜索和网络优化而来。
这里我们不详细讨论 NAS网络搜索技术,虽然这是论文的一大亮点。原因是这个技术不是一般人玩得起的…它相当于训练的不是模型参数,而是模型架构。说白了就是设计一个网络模型结构的集合,通过不同网络层的排列组合可以组合出许多许多的模型,再通过NAS搜索技术搜索出最佳的网络结构。这相当于大力出奇迹嘛,将调参工作交给NAS技术去做,实属一种降维打击。
当然,随之而来的缺点也很明显,这需要大量的计算资源才能完成,恐怕只有想GoogLe,Baidu这种可以买显卡当买白开水的公司才有财力去搞这些研究。而且,由于搜索过程中最关注网络的性能,因此最优的的网络结构可能长得五花八门,换一种说法就是层级结构的排列可能比较混乱。
这就导致了两个缺点:
一:网络的可解释性更差,没办法说为啥这么排列性能好,这能说实验得出…
二:这种不规律的模型层级排列也不利于模型的部署。因此经过NAS搜索后的模型一般需要人为的进行进一步调整,让它长的规矩一些。也是性能和部署之间的trade-off。
当然,NAS网络结构搜索技术还是很强的,一方面是通过设计不同的搜索空间,NAS可以设计不同的搜索目标 。好奇的同学可以自行查阅资料,这算是一个比较前言的方向了。
1. 对 V2 最后几层的修改
作者实验发现 V2 网络最后一部分结构可以优化,如Figure5所示,原始的结构用 1x1 的卷积来调整 feature 的维度,从而提高预测的精度,但是这一部分也会造成一定的延时,为了减少延时,作者把 average pooling 提前,这样的话,这样就提前把 feature 的 size 减下来了(pooling 之后 feature size 从 7x7 降到了 1x1)。这样一来延时减小了,但是试验证明精度却几乎没有降低。
![improved V2 last layers](https://i-blog.csdnimg.cn/blog_migrate/08cd87de730cf904c39eda0fea090b0f.png)
2. h-swish
这个得先说说 swish(也是 google 自家人搞出来的),说是这个激活函数好用,替换 ReLU 可以提高精度,但是这个激活函数(主要是 σ ( x ) \sigma(x)σ(x) 部分)在移动端设备上显得太耗资源,所以作者又提出了一个新的 h-swish 激活函数来取代 swish,效果跟 swish 差不多,但是计算量却大大减少。
![h-swish](https://i-blog.csdnimg.cn/blog_migrate/096e08c5d6027ad39035bd7732744252.png)
具体的数学公式如下:
h
−
swish
[
x
]
=
x
ReLU
6
(
x
+
3
)
6
\mathrm{h}-\operatorname{swish}[x]=x \frac{\operatorname{ReLU} 6(x+3)}{6}
h−swish[x]=x6ReLU6(x+3)
其中,说明一下ReLU6,卷积之后通常会接一个ReLU非线性激活,在Mobile v1里面使用ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。
3. squeeze-and-excite(SE)
Squeeze-and-Excitation Networks(SENet)是由自动驾驶公司Momenta在2017年公布的一种全新的图像识别结构【传送门】,它通过对特征通道间的相关性进行建模,把重要的特征进行强化来提升准确率。这个结构是2017 ILSVR竞赛的冠军,top5的错误率达到了2.251%,比2016年的第一名还要低25%,可谓提升巨大。SE也被一下研究人员成为基于通道的注意力机制。
与MobileNetV2相比,MobileNetV3 中增加了 SE 结构,并且将含有 SE 结构部分的 expand layer 的 channel 数减少为原来的 1/4 以减少延迟(但是,从计算时间上看,貌似只是减少了1/2),试验发现这样不仅提高了模型精度,而且整体上延迟也并没有增加。
![MobileNetV3 with SE](https://i-blog.csdnimg.cn/blog_migrate/6803b5e1684263a6aeb7477224d936b8.png)
MobileNet V3 with SE的代码实现如下所示。
1.def _make_divisible(ch, divisor=8, min_ch=None):
2. """
3. 这个函数取自原始的tf repo.
4. 它确保所有层都有一个能被8整除的通道号
5. """
6. if min_ch is None:
7. min_ch = divisor
8. new_ch = max(min_ch, int(ch + divisor / 2) // divisor * divisor)
9. # 确保四舍五入后的下降幅度不超过10%。
10. if new_ch < 0.9 * ch:
11. new_ch += divisor
12. return new_ch
13.
14.class SqueezeExcitation(nn.Module):
15. def __init__(self, input_c: int, squeeze_factor: int = 4):
16. super(SqueezeExcitation, self).__init__()
17. squeeze_c = _make_divisible(input_c // squeeze_factor, 8)
18. self.fc1 = nn.Conv2d(input_c, squeeze_c, 1)
19. self.fc2 = nn.Conv2d(squeeze_c, input_c, 1)
20.
21. def forward(self, x ):
22. scale = F.adaptive_avg_pool2d(x, output_size=(1, 1))
23. scale = self.fc1(scale)
24. scale = F.relu(scale, inplace=True)
25. scale = self.fc2(scale)
26. scale = F.hardsigmoid(scale, inplace=True)
27. return scale * x
28.
29.class SEMBconv(nn.Module):
30. def __init__(self, in_channels, out_channels, stride, padding):
31. super().__init__()
32. hidden_channel = in_channels * 6
33. self.SEMBconv = nn.Sequential(
34. nn.Conv2d(in_channels, hidden_channel, kernel_size=1, stride=stride, padding=padding, groups=in_channels),
35. nn.BatchNorm2d(hidden_channel),
36. nn.ReLU(inplace=True),
37. nn.Conv2d(hidden_channel, hidden_channel, kernel_size=3, stride=stride, padding=padding, groups=in_channels),
38. nn.BatchNorm2d(hidden_channel ),
39. nn.ReLU(inplace=True),
40. SqueezeExcitation(hidden_channel),
41. nn.Conv2d(hidden_channel, out_channels, kernel_size=1, stride=stride, padding=padding),
42. nn.BatchNorm2d(out_channels),
43. nn.ReLU(inplace=True)
44. )
45. def forward(self, x):
46. return self.InvertMBconv(x) + x
Model Architecture
MobileNetV3的网络模型如下,其中Table1对应着MobileNetV3_Large版的网络结构参数;Table2对应着MobileNetV3_Small版;
![MobileNetV3 Model Architecture](https://i-blog.csdnimg.cn/blog_migrate/19e74d1489a163bf3446b8ff89d82832.png)
值得注意的是:对比 V2 还可以发现, V3模型开始的 conv2d 部分的输出feature map数量减少为原来的一般了,试验发现延迟有所降低,精度没有下降。
至于效果,相比 V2 1.0 来说, V3-Small 和 V3-Large 在性能和精度上各有优势。但是在工程实际中,特别是在移动端上 V2 用的更为广泛,因为 V2 结构更简单,移植更方便,速度也更有优势。
![MobileNetV3 Model Speed Comparsion](https://i-blog.csdnimg.cn/blog_migrate/8a9d2448a30aa1f97f6721cf7455d8ae.png)
小结
MobileNet V3是谷歌团队在MobileNet V2基础上进一步优化的轻量级深度学习卷积神经网络(CNN)架构。它继承了MobileNet V1和MobileNet V2的优点,同时融合了神经网络架构搜索技术(Neural Architecture Search,NAS),在性能和效率方面取得了更大的提升。MobileNet V3的主要特点如下。
- 搜索驱动的网络结构:MobileNet V3通过NAS技术自动搜索到了一种高效的网络结构。这种结构包括了适应性的ReLU激活函数(如h-swish),以及针对不同输入分辨率的特定层次结构。
- 逆残差结构(Inverted Residual Blocks):MobileNet V3沿用了MobileNet V2的逆残差结构,这种结构有助于减小计算成本,同时保持特征表达能力。
- 调整宽度和分辨率:与MobileNet V1和V2类似,MobileNet V3也使用宽度乘子(α)和分辨率乘子(ρ)这两个超参数调整模型的大小和计算复杂性。这使得用户可以根据设备性能和应用场景进行权衡以平衡模型的精度和速度。
- 更高的性能与效率:相较于MobileNet V1和V2,MobileNet V3在保持轻量化、低延迟和低计算资源占用的基础上,进一步提高了性能和效率。这使得它在多种计算机视觉任务中表现更优。