【常规convolutions】
定义输入feature map尺寸为 D F × D F × M D_F\times D_F\times M DF×DF×M,输出feature map尺寸为 D F × D F × N D_F\times D_F\times N DF×DF×N,假设卷积前后空间维度不变,通道数由 M M M变为 N N N
定义卷积核为 N N N个 D K × D K × M D_K\times D_K\times M DK×DK×M
常规卷积的计算量为
N
⏟
N
个
⋅
D
K
⋅
D
K
⋅
M
⏟
一个位置上卷积
⋅
D
F
⋅
D
F
⏟
遍历所有位置
\underbrace{N}_{N个}\cdot\underbrace{D_K\cdot D_K\cdot M}_{\text{一个位置上卷积}}\cdot\underbrace{D_F\cdot D_F}_{\text{遍历所有位置}}
N个
N⋅一个位置上卷积
DK⋅DK⋅M⋅遍历所有位置
DF⋅DF
【depthwise separable convolutions】
depthwise separable convolutions的思想是首先孤立 M M M个channel,各个channel自己做卷积,然后使用conv1x1联系 M M M个channel,输出 N N N个channel
第一步,depthwise convolution
因为把每个channel独立开来,所以看作
M
M
M个
D
F
×
D
F
×
1
D_F\times D_F\times 1
DF×DF×1,那么卷积核的尺寸一定是
M
M
M个
D
K
×
D
K
×
1
D_K\times D_K\times 1
DK×DK×1,这一步的结果为
D
F
×
D
F
×
M
D_F\times D_F\times M
DF×DF×M
这一步的计算量为
M
⏟
M
个
⋅
D
K
⋅
D
K
⋅
1
⏟
一个位置上卷积
⋅
D
F
⋅
D
F
⏟
遍历所有位置
\underbrace{M}_{M个}\cdot\underbrace{D_K\cdot D_K\cdot 1}_{\text{一个位置上卷积}}\cdot\underbrace{D_F\cdot D_F}_{\text{遍历所有位置}}
M个
M⋅一个位置上卷积
DK⋅DK⋅1⋅遍历所有位置
DF⋅DF
第二步,pointwise convolution
利用conv1x1改变通道数,那么卷积核的尺寸为
N
N
N个
1
×
1
×
M
1\times1\times M
1×1×M
这一步的计算量为
N
⏟
N
个
⋅
1
⋅
1
⋅
M
⏟
一个位置上卷积
⋅
D
F
⋅
D
F
⏟
遍历所有位置
\underbrace{N}_{N个}\cdot\underbrace{1\cdot1\cdot M}_{\text{一个位置上卷积}}\cdot\underbrace{D_F\cdot D_F}_{\text{遍历所有位置}}
N个
N⋅一个位置上卷积
1⋅1⋅M⋅遍历所有位置
DF⋅DF
故整个的计算量为
D
K
⋅
D
K
⋅
M
⋅
D
F
⋅
D
F
+
M
⋅
N
⋅
D
F
⋅
D
F
(
5
)
=
D
F
⋅
D
F
⋅
M
⋅
(
D
K
⋅
D
K
+
N
)
\begin{aligned} &D_K\cdot D_K\cdot M\cdot D_F\cdot D_F + M\cdot N \cdot D_F\cdot D_F \qquad(5) \\ &=D_F\cdot D_F\cdot M\cdot(D_K\cdot D_K + N) \end{aligned}
DK⋅DK⋅M⋅DF⋅DF+M⋅N⋅DF⋅DF(5)=DF⋅DF⋅M⋅(DK⋅DK+N)
【MobileNet Architecture】
常规的网络有Conv3x3-BN-ReLU模块,在MobileNet中修改如下
(N, C, H, W)
【Depthwise Conv3x3】
【BN + ReLU】
(N, C, H, W)
【Conv1x1 C→C】
【BN + ReLU】
(N, C, H, W)
若要实现空间维度减半,channel翻倍,则为
(N, C, H, W)
【Depthwise Conv3x3, s=2, p=1】
【BN + ReLU】
(N, C, H/2, W/2)
【Conv1x1 C→2C】
【BN + ReLU】
(N, 2C, H/2, W/2)
MobileNet结构
(N, 3, 224, 224)
【Conv3x3 3→32 s=2 p=1】
【BN + ReLU】
(N, 32, 112, 112)
【Conv3x3 dw s=1 p=0】(第1组,通道32→64)
【BN + ReLU】
(N, 32, 112, 112)
【Conv1x1 32→64 s=1 p=0】
【BN + ReLU】
(N, 64, 112, 112)
【Conv3x3 dw s=2 p=1】(第2组,通道加倍,空间减半)
【BN + ReLU】
(N, 64, 56, 56)
【Conv1x1 64→128 s=1 p=0】
【BN + ReLU】
(N, 128, 56, 56)
【Conv3x3 dw s=1 p=0】(第3组,残差)
【BN + ReLU】
(N, 128, 56, 56)
【Conv1x1 128→128 s=1 p=0】
【BN + ReLU】
(N, 128, 56, 56)
【Conv3x3 dw s=2 p=1】(第4组,通道加倍,空间减半)
【BN + ReLU】
(N, 128, 28, 28)
【Conv1x1 128→256 s=1 p=0】
【BN + ReLU】
(N, 256, 28, 28)
Conv3x3 dw s=1 p=0】(第5组,残差)
【BN + ReLU】
(N, 256, 28, 28)
【Conv1x1 256→256 s=1 p=0】
【BN + ReLU】
(N, 256, 28, 28)
【Conv3x3 dw s=2 p=1】(第6组,通道加倍,空间减半)
【BN + ReLU】
(N, 256, 14, 14)
【Conv1x1 256→512 s=1 p=0】
【BN + ReLU】
(N, 512, 14, 14)
Conv3x3 dw s=1 p=0】(第7组,残差,重复5次)
【BN + ReLU】
(N, 512, 14, 14)
【Conv1x1 512→512 s=1 p=0】
【BN + ReLU】
(N, 512, 14, 14)
【Conv3x3 dw s=2 p=1】(第8组,通道加倍,空间减半)
【BN + ReLU】
(N, 512, 7, 7)
【Conv1x1 512→1024 s=1 p=0】
【BN + ReLU】
(N, 1024, 7, 7)
【Global AvgPool】
(N, 1024, 1, 1)→(N, 1024)
【Linear 1024→1000】
【Softmax】
(N, 1000)
缩放参数
设置width multiplier
α
\alpha
α表示对通道数进行缩减
当
α
=
1
\alpha=1
α=1时,通道数3→32→64→128→256→512→1024
当
α
=
0.75
\alpha=0.75
α=0.75时,通道数3→24→48→96→192→384→768
当
α
=
0.5
\alpha=0.5
α=0.5时,通道数3→16→32→64→128→256→512
当
α
=
0.25
\alpha=0.25
α=0.25时,通道数3→8→16→32→64→128→256
设置resolution multiplier
ρ
\rho
ρ
当
ρ
=
1
\rho=1
ρ=1时,空间尺寸224→112→56→28→14→7
当
ρ
=
6
/
7
\rho=6/7
ρ=6/7时,空间尺寸192→96→48→24→12→6
当
ρ
=
5
/
7
\rho=5/7
ρ=5/7时,空间尺寸160→80→40→20→10→5
当
ρ
=
4
/
7
\rho=4/7
ρ=4/7时,空间尺寸128→64→32→16→8→4
Table 6和7给出了不同
α
\alpha
α和
ρ
\rho
ρ的实验结果