2.3 MobileNet V2思考

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

《2.3 MobileNet V2思考》 图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.3 MobileNet V2思考》 图2 ResNet 与 MobileNet V2 的微结构

         从图2可知,Residual的模块是先降维再升维,而MobileNet V2的微结构是先升维在降维。MobileNet V2的微结构在维度变化上与Residual刚好相反,因此也把这种结构称为Inverted residual。

2.3 MobileNet V2的结构

《2.3 MobileNet V2思考》 图3 MobileNet V2的宏观结构

         MobileNet V2的主要子结构为bottleneck,其余的和普通CNN类似。如果想将这个结构用在嵌入式系统上,建议看看ZynqNet的优化思路。

《2.3 MobileNet V2思考》 图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)

《2.3 MobileNet V2思考》 图5 Inverted bottleneck块结构

4 优缺点分析

优点:

  • 借鉴了MobileNet V1和ResNet的优点,依然保持良好的计算速度和较小的存储需求
  • 核心模块Linear bottleneck和inverted residual提升网络性能
    缺点:
  • 依然是调参的问题
  • 依赖于优化策略

5 总结

         本文先介绍了优化动机。说白了就是MobileNet V1太老了,一些新的优化思路可以用到MobileNet V1中,于是就有了MobileNet V2。然后介绍了优化思路和MobileNet V2的核心结构和网络宏观结构,最后给出了核心结构的代码,最后对MobileNet V2的优缺点进行了分析。

    原文作者:深度学习模型优化
    原文地址: https://www.jianshu.com/p/85f2f4550a94
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞