MobileNet V1可以看我的文章
原则:保持模型性能(accuracy)的前提下降低模型大小(parameters size),同时提升模型速度(speed, low latency)。
1优化动机
- 在MobileNet V1的基础上进行优化,主要是针对depthwise训出来的kernel有不少是空的这个问题进行优化。
- 进一步满足小模型设计的原则。(当然这个原则是需要一直迭代做下去的)
2 网络结构
两个核心的结构优化:
- Inverted residual 。灵感来源于对ResNet的改进。
- Linear Bottlenecks。灵感来源于对MobileNet V1的改进。
2.1 Linear Bottlenecks
图1 MobileNet V1 与 V2 的微结构
从图1可以看到,微结构的变化主要是在Depthwise convolution的前面增加了pointwise convolution的操作,提高了DW输入特征图的数量,使得可以学习跟多的特征。另外减弱ReLU对学习梯度弥散的影响。该结构也被称为Linear Bottleneck,有以下特点:
- V2 在 DW 卷积之前新加了一个 PW 卷积。这是因为DW不具备维度改变的功能,而作者又希望DW在更高维的空间学习特征,因此在DW之前增加PW来增加DW的输入维度。
- V2 去掉了第二个 PW 的激活函数。这么做的原因,是因为作者认为激活函数在高维空间能够有效的增加非线性,而在低维空间时则会破坏特征。
2.2 Inverted residual
图2 ResNet 与 MobileNet V2 的微结构
从图2可知,Residual的模块是先降维再升维,而MobileNet V2的微结构是先升维在降维。MobileNet V2的微结构在维度变化上与Residual刚好相反,因此也把这种结构称为Inverted residual。
2.3 MobileNet V2的结构
图3 MobileNet V2的宏观结构
MobileNet V2的主要子结构为bottleneck,其余的和普通CNN类似。如果想将这个结构用在嵌入式系统上,建议看看ZynqNet的优化思路。
图4 MobileNet V2的细节结构
3 代码
inverted bottleneck block:
def inverted_block(net, input_filters, output_filters, expand_ratio, stride, scope=None):
'''fundamental network struture of inverted residual block'''
with tf.name_scope(scope):
res_block = slim.conv2d(inputs=net, num_outputs=input_filters * expand_ratio, kernel_size=[1, 1])
# depthwise conv2d
res_block = slim.separable_conv2d(inputs=res_block, num_outputs=None, kernel_size=[3, 3], stride=stride, depth_multiplier=1.0, normalizer_fn=slim.batch_norm)
res_block = slim.conv2d(inputs=res_block, num_outputs=output_filters, kernel_size=[1, 1], activation_fn=None)
# stride 2 blocks
if stride == 2:
return res_block
# stride 1 block
else:
if input_filters != output_filters:
net = slim.conv2d(inputs=net, num_outputs=output_filters, kernel_size=[1, 1], activation_fn=None)
return tf.add(res_block, net)
图5 Inverted bottleneck块结构
4 优缺点分析
优点:
- 借鉴了MobileNet V1和ResNet的优点,依然保持良好的计算速度和较小的存储需求
- 核心模块Linear bottleneck和inverted residual提升网络性能
缺点: - 依然是调参的问题
- 依赖于优化策略
5 总结
本文先介绍了优化动机。说白了就是MobileNet V1太老了,一些新的优化思路可以用到MobileNet V1中,于是就有了MobileNet V2。然后介绍了优化思路和MobileNet V2的核心结构和网络宏观结构,最后给出了核心结构的代码,最后对MobileNet V2的优缺点进行了分析。