MobileNet系列V1/V2/V3网络结构
MobileNet V1
网络特点
MobileNet V1提出:
1.深度可分离卷积(Depthwise Separable Convolution),由深度卷积Depthwise(DW)和逐点卷积Pointwise(PW)构成;
2.模型压缩系数(调整通道数和分辨率)。
标准卷积和深度可分离卷积的区别如下:
输入特征图:DF x DF x M
卷积核:DK x DK
输出通道:N
————————————————————————————
标准卷积参数量:A = DK x DK x M x N
深度可分离卷积参数量:B = DK x DK x M + M x N
计算量缩减:
B
A
B\over A
AB =
1
N
1\over N
N1 +
1
D
k
2
1\over Dk^2
Dk21
————————————————————————————
标准卷积计算量:A = DK x DK x M x N x DF x DF
深度可分离卷积计算量:B = DK x DK x M x DF x DF + M x N x DF x DF
计算量缩减:
B
A
B\over A
AB =
1
N
1\over N
N1 +
1
D
k
2
1\over Dk^2
Dk21
一般卷积核采用3x3,而N>>9,因此深度可分离卷积的参数量和计算量都是标准卷积的1/8 - 1/9
网络结构
卷积块 = Conv2D + BN + relu6
深度可分离卷积块 = DepthwiseConv2D + BN + relu6 + Conv2D (pointwise_conv_filters, alpha调整通道数) + BN + relu6
relu6代码
def relu6(x):
return K.relu(x, max_value=6)
模型压缩系数
宽度(通道)系数:
——计算量缩减
α
\alpha
α2
α
\alpha
α 一般取1,0.75,0.5,0.25
DK x DK x
α
\alpha
αM x DF x DF +
α
\alpha
αM x
α
\alpha
αN x DF x DF
分辨率系数:
——计算量缩减
ρ
\rho
ρ2
DK x DK x
α
\alpha
αM x
ρ
\rho
ρDF x
ρ
\rho
ρ DF +
α
\alpha
αM x
α
\alpha
αN x
ρ
\rho
ρDF x
ρ
\rho
ρDF
MobileNet V2
网络特点
MobileNet V2提出了 the inverted residual with linear bottleneck,线性瓶颈反残差结构。
扩张(1x1 conv) -> 抽取特征(3x3 depthwise)-> 压缩(1x1 conv)
和MobileNet V1网络区别如下:
相同点:都使用了Depthwise + Pointwise(1x1)结构。
不同点:输入增加Conv 1x1升维,输出增加Conv 1x1降维,而且不使用Relu6函数,保证特征不被破坏,输出的Relu6变为Linear。
先升维再降维是因为Depthwise不能改变channel,如果输入channel很低,则Depthwise就在低维提取特征,所以先升维,定义expansion=6来转换成高维空间。
替换Relu6为Linear是因为激活函数在高维空间能有效增加非线性,而在低维空间会破坏特征,不如线性效果好。
Inverted Residual和Resnet网络区别如下:
相同点:1x1——>3x3——>1x1、shortcut。
不同点:Resnet先降后升,MobileNet V2先升后降,且Conv变为Dwise结构。
网络结构
t = expansion,c = channel,n = repeated times,s = stride
MobileNet V3
针对计算资源,发布了MobileNetV3-Large和MobileNetV3-Small两种网络结构。
网络特点
MobileNet V3利用了以下思想:
1.MobileNet V1的depthwise separable convolutions;
2.MobileNet V2的the inverted residual with linear bottleneck;
3.Squeeze and excitation结构的轻量级注意力模型;
4.利用hard-swish代替swish激活函数。
网络结构
MobileNet-v2和MobileNet-v3残差块的不同:
MobileNet-v3相比V2,块中引入了注意力模块,代码如下:
Pool+FC+relu6+FC+h-swish
def squeeze(inputs):
input_channels = int(inputs.shape[-1])
x = GlobalAveragePooling2D()(inputs)
x = Dense(int(input_channels/4))(x)
x = Activation(relu6)(x)
x = Dense(input_channels)(x)
x = Activation(hard_swish)(x)
x = Reshape((1, 1, input_channels))(x)
x = Multiply()([inputs, x])
return x
MobileNetV3-Large网络:
MobileNetV3-Small网络:
h-swish激活函数
swish(x) = x *
σ
\sigma
σ(x)
以下是平滑版本的Sigmoid/Swish和Hard版本的Sigmoid/Swish对比: