【常规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 ρ的实验结果