论文:MobileNetV2: Inverted Residuals and Linear Bottlenecks(CVPR 2018)
两点改进
MobileNets v1 用 Depthwise Separable Convolution 代替标准的卷积,MobileNets v2 在此基础上提出了两点改进:
- Linear Bottlenecks
- Inverted residuals
Linear Bottlenecks
manifold
:翻译成流形,这里应该是指空间(含螺旋结构的二维空间),在一个更高维的空间里被扭曲折叠(变换到n维空间),Relu会造成一定的空间坍塌,导致原二维空间上信息流失
为清楚ReLU对不同维度输入信息丢失程度,使用随机矩阵 T 将初始螺旋嵌入到 n 维空间中(这里相当于得到特征图谱),紧接着使用 ReLU 激活函数,最后使用
T
−
1
T^{-1}
T−1 反变换回2D空间,由 Figure 1
可知:
- 当 n = 2 , 3 n = 2,3 n=2,3 即维度较低时,初始螺旋结构信息丢失较多
- 当 n = 15 , 30 n=15 , 30 n=15,30 维度较高时,初始信息保存相对完整
由此可知:v1中用通道比例参数
α
\alpha
α 控制模型瘦身程度,但是在减少通道后,紧跟着Relu激活层容易丢失信息,所以在v2在通道数较少的特征图后面直接弃用Relu,也就是 Linear Bottlenecks
,如下图(d),最后一层不含Relu激活函数
(3): InvertedResidual(
(conv): Sequential(
(0): Conv2d(24, 144, kernel_size=(1, 1), stride=(1, 1), bias=False)
(1): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(2): ReLU6(inplace=True)
(3): Conv2d(144, 144, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=144, bias=False)
(4): BatchNorm2d(144, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
(5): ReLU6(inplace=True)
(6): Conv2d(144, 24, kernel_size=(1, 1), stride=(1, 1), bias=False)
(7): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)
)
Inverted residuals
如下图所示:
- (a)表示正常的残差模块,先降维后升维
- (b)表示Inverted residuals,先升维后降维
Inverted residuals出发点是减少计算量,中间之所以升维应该是为了提取足够的特征,Inverted residuals blocks最后一层特征维度较低,所以直接弃用了Relu,也就是前面的 Linear Bottlenecks
相关实验
由下图可知:Relu6(最大值不超过6)表现比普通Relu更好,采用 Linear Bottlenecks 使得网络精度更高
参考文献
【1】详解MobileNetV2
【2】MobileNet v2 算法笔记
【3】轻量级网络–MobileNetV2论文解读