MobileNets系列是Google提出来的适用于边缘设备的轻量化网络结构,到目前为止一共出了篇文章MobileNet V1 ~ V3,最早于2017年提出,因其轻量化的结构和优秀的性能而得到广泛使用。
MobileNet V1
https://arxiv.org/pdf/1704.04861.pdf
宏观上来讲MobileNet V1就是将标准卷积换成了深度可分离卷积(Depthwise Separable Convolution),那么是深度可分离卷积呢?
深度可分离卷积
举个例子,输入 5 × 5 × 3 5\times5\times3 5×5×3的特征,如果想要得到一个 3 × 3 × 4 3\times3\times4 3×3×4的输出,那么卷积核的大小应该是 3 × 3 × 3 × 4 3\times3 \times3\times4 3×3×3×4,即一共有4个 3 × 3 × 3 3\times3 \times3 3×3×3的卷积核,每个卷积核的3个通道分别对输入图像的3个通道的每个位置element-wise multiply之后相加得到输出特征图的一个通道。
深度可分离卷积顾名思义是在深度上对常规卷积进行分离,一个深度可分离卷积包含逐通道的Depthwise Convolution和逐点卷积Pointwise Convolution。
在Depthwise Conv中,输出特征的通道数和输入特征的通道数保持一致,具体来说,可以把卷积核看作是 k × k × 1 k\times k\times1 k×k×1的单通道卷积核,每个卷积个只对输入特征的一个通道进行运算,由于输入输出的通道保持一致,所以卷积核的数量等于输入特征的通道数量。在上面这个例子中,输入 5 × 5 × 3 5\times5\times3 5×5×3的特征,卷积核是 3 × 3 × 1 × 3 3\times3\times1\times3 3×3×1×3,即3个 3 × 3 × 1 3\times3\times1 3×3×1的卷积核,输出特征为 3 × 3 × 3 3\times3\times3 3×3×3。
Depthwise Conv可以看作是group Conv的一个特例,即到分组数等于输入特征的通道数量时,分组卷积就可以看作是一个Depthwise Conv了。
Pointwise Conv可以看作是一个标准的 1 × 1 1\times1 1×1卷积。为什么要逐点卷积呢?从Depthwise Conv中我们会发现,每个卷积个其实只对输入的一个通道起作用,这样会导致输出的特征是输入特征每个通道单独计算的结果,缺少了通道间信息的交互。所以为了解决这个问题引入了Pointwise Conv对不同通道的信息进行融合。
那么采用深度可分离卷积之后,计算量/参数量到底减少了多少呢?
对于一个
D
F
×
D
F
×
M
D_{F} \times D_{F} \times M
DF×DF×M的输入特征,要产生一个
D
F
×
D
F
×
N
D_{F} \times D_{F} \times N
DF×DF×N的输出特征,对于标准卷积来说,卷积核的形状为
D
k
×
D
k
×
M
×
N
D_{k} \times D_{k} \times M \times N
Dk×Dk×M×N
参
数
量
:
D
k
×
D
k
×
M
×
N
计
算
量
:
D
k
×
D
k
×
M
×
N
×
D
F
×
D
F
参数量: D_{k} \times D_{k} \times M \times N \\ 计算量: D_{k} \times D_{k} \times M \times N \times D_{F} \times D_{F}
参数量:Dk×Dk×M×N计算量:Dk×Dk×M×N×DF×DF
而对于深度可分离卷积来说,卷积个的尺寸分别为
D
k
×
D
k
×
1
×
M
D_{k} \times D_{k} \times 1 \times M
Dk×Dk×1×M和
1
×
1
×
M
×
N
1 \times 1 \times M \times N
1×1×M×N。
参
数
量
:
D
k
×
D
k
×
1
×
M
+
1
×
1
×
M
×
N
计
算
量
:
D
k
×
D
k
×
1
×
M
×
D
F
×
D
F
+
1
×
1
×
M
×
N
×
D
F
×
D
F
参数量: D_{k} \times D_{k} \times 1 \times M + 1 \times 1 \times M \times N\\ 计算量: D_{k} \times D_{k} \times 1 \times M \times D_{F} \times D_{F} + 1 \times 1 \times M \times N \times D_{F} \times D_{F}
参数量:Dk×Dk×1×M+1×1×M×N计算量:Dk×Dk×1×M×DF×DF+1×1×M×N×DF×DF
我们会发现深度可分离卷积相比常规卷积在参数量和计算量上都减少为原来的
1
N
+
1
N
k
2
\frac{1}{N} + \frac{1}{N_{k}^2}
N1+Nk21。
计算量、参数量和模型最后推理的耗时并不一定趁正相关,这还更其他因素有关,可参考https://zhuanlan.zhihu.com/p/411522457
网络结构
MobileNet V1的网络结构图如上图所示,首先通过一个stride为2的常规卷积进行下下采样,然后堆积深度可分离卷积,最后通过AVG、FC和softmax进行分类。整个网络用了13层深度可分离卷积。
可以看到,由于采用了深度可分离卷积,整个网络中94.86%的计算量和74.59%的参数量都集中在了 1 × 1 1\times 1 1×1卷积( dense matrix operations)中。常规卷积在底层运算的时候需要先通过im2col函数重整内存,转换成经过高度优化后的 general matrix multiply (GEMM) 运算,而这一步操作时延较高。但是 1 × 1 1\times 1 1×1卷积并不需要im2col操作而可以直接采用GEMM运算。
超参数
未来满足不同应用对模型大小的要求,MobileNet V1中还引入了两个超参数:调节每一层通道数量的width multiplier α \alpha α和调节特征尺寸的resolution multiplier ρ。
实验结果
标准大小的MobileNet v1在参数量、计算量都减少的情况了比GoogleNet在ImageNet上取得了更好的准确性,VGG 16比MobileNet V1的参数量多了近30倍,但是准确性也只高了1%。
MobileNet V2
https://arxiv.org/pdf/1801.04381.pdf
MobileNet V1过后Google又提出了升级版《MobileNetV2: Inverted Residuals and Linear Bottlenecks》,从题目可以看出来,V2的最大升级就是采用了Inverted Residuals和Linear Bottlenecks,这两个模块是什么呢?接下来我们将一探究竟。
Linear BottleNecks
在MobileNet V1中激活函数使用的是ReLU,参考中提到的,使用深度可分离卷积结合ReLU进行训练,卷积核参数中会出现很多为0的参数,导致模型性能降低。在V2中作者通过一个实验对此进行了讨论。对于一个二维的输入 X m X_{m} Xm,通过一个矩阵T将其变换到n维空间(n >= 2),经过ReLU函数之后通过 T − 1 T^{-1} T−1逆变换将结果变换回2维空间,从结果可以发现当n=2、3时,与输入相比已经损失很大一部分信息了,当n=15、30时,信息的损失就减轻了。
也就是说,在低维空间使用ReLU会造成极大的信息损失,而在高维空间使用ReLU信息损失会少很多。
所以在MobileNet V2中,作者将每个Block的最后一个ReLU函数去掉,不加任何激活函数,将这个模块称为Linear BottleNecks,并通过实验证明该模块的性能。
Inverted Residual
在常规的Residual中(ResBolock)通常是先采用
1
×
1
1 \times 1
1×1卷积将通道降维,然后进行卷积,最后再
1
×
1
1 \times 1
1×1卷积将通道恢复回来。但是对于Depthwise Conv来说,它本身不具备改变通道维度的能力,输出时多少输出就是多少,相较传统卷积来说,从输入到的特征信息已经减少了,如果再降维的话效果可能会更差了。所以在MobileNet V2中提出了一个Inverted Residual Block,即先通过
1
×
1
1 \times 1
1×1卷积升维,进行Depthwise Conv之后,再通过Linear
1
×
1
1 \times 1
1×1卷积降维。
网络结构
MobileNet V2的主要模块就是Inverted Residual Block,从上图可以看到,在stride=1的时候,采用了shortcut,当stride=2的时候,由于输入输出通道数不一致,所以取消了shortcut。激活函数ReLU6,限制了ReLU的最大输出值为6。实验结果
ImageNet分类:
目标检测:
分割:
MobileNet V3
https://arxiv.org/pdf/1905.02244.pdf
从论文题目《Searching for MobileNetV3》就可以看出来MobileNetV3是通过NAS搜索出来的。由于对NAS不了解,这里也就不过多的记录与NAS相关的内容了。
MobileNet V3相比V2新增的内容:
- 采用platform-aware NAS搜索宏观的结构,采用NetApat算法搜索每一层的通道数
- 重新设计网络耗时高的层
- 采用新的激活函数hard-swish
- 加入Squeeze-and-Excite模块
重新设计特定层
在V2中采用了Inverted Residual Block作为base block,在最后一个block之后(上图红框)通过一个 1 × 1 1\times1 1×1卷积对特征进行升维,有利于后续进行预测,但是同样也引入了额外的计算成本。
为了减少时延,去除了last stage之前的block,并且还是把 1 × 1 1\times1 1×1卷积放在AVG的后面,这样 1 × 1 1\times1 1×1卷积就是在 1 × 1 1\times1 1×1的特征空间上运算而不是 7 × 7 7\times7 7×7。
MobileNet V3-Large
MobileNet V3-Small
Hard-swish
swish是谷歌在2017年提出来的激活函数,其备无上界有下界、平滑、非单调的特性,并且在深层模型中效果优于ReLU。
s
w
i
s
h
=
x
∗
s
i
g
m
o
i
d
(
x
)
swish = x * sigmoid(x)
swish=x∗sigmoid(x)
但是sigmoid函数对于移动端的硬件来说不是很友好,相比而言,ReLU6对几乎所有的软件和硬件都支持,其次,对于量化场景下ReLU6能够减轻精度损失带来的性能损失。所以,在V3中通过ReLU6来近似sigmoid函数,然后得到hard-swish函数:
h
a
r
d
−
s
w
i
s
h
=
x
∗
R
e
L
U
6
(
x
+
3
)
6
hard-swish = x * \frac{ReLU6(x + 3)}{6}
hard−swish=x∗6ReLU6(x+3)
在V3中作者只在模型的后半段使用hard-swish,因为作者发现在越深的网络层中,swish/hard-swish效果越好。
Block
在V3的基础模块中引入了一种新的模块Squeeze-and-Excite(SE)——一种轻量化的注意力模块,
实验结果
Object Detection on COCO test set:
Semantic Segmentation on Cityscapes val set:
参考
[1] https://zhuanlan.zhihu.com/p/70703846
[2] https://blog.csdn.net/zml194849/article/details/117021815