Press "Enter" to skip to content

Efficient CNN 介绍(一):MobilenetV1

Efficient CNN 介绍(一):MobilenetV1

 

前言

 

在这篇文章,主要会大略的介绍 MobilenetV1 透过了什幺样的方式达到 Efficient CNN
的目的,因此假如想知道更加详细的话,建议可以阅读Mobilenet系列的论文,相信可以收穫多多的。

 

Introduction

 

在早期的深度学习中,大家普遍都遇到了一个问题:

 

越深的网路,错误率越高

 

而造成这个问题主要原因是 梯度消失以及梯度爆炸(gradient vanishing / gradient exploding)
,也就是在透过 back propagation 计算梯度的时候,随着一层一层 chain rule 的计算,梯度也因为不断的相乘而越来越大或是越来越小,使得到了网路的前几层时,已经没有办法好好更新网路中的 weight 了。

 

在 2015 年,ResNet 的透过了 residual learning 的方式解决了过去大家普遍遇到的问题,并使得 CNN(Convolution Neural Network) 为了使得準确度提昇到更高的情况下,更深更複杂。

 

但是随着 CNN 为了更好的準确度而更深更複杂的情况下,大家开始遇到了一个问题:

 

太耗资源了!

 

在实际应用面上,不论是手机摄影机或是其他的嵌入式系统,我们并没有办法像一般电脑一样,随便都插上几张 2080Ti 的GPU,因此在这样的情况下,我们所需要的是:

 

更小更快同时可以兼顾準确度的 CNN

 

也就是今天的主题, Efficient CNN

 

MobilenetV1

 

在2017年 Google 所提出的 MobilenetV1 中,透过 Depthwise Separable Convolution 将传统的 Convolution 拆解成了两个步骤,以大幅的减少传统 Convolution 的运算量:

 

 

    1. Depthwise convolution

 

    1. 1×1 convolution (pointwise convolution)

 

左边为传统的 Convolution,而右边为将传统 Convolution 拆解成两个步骤的 Depthwise Separable Convolution。

而单纯看上面的名词可能完全没有办法了解他们的是如何减少网路的运算量的,因此接下来我们会来做更加详细的介绍,而在正式开始讲解 Depthwise Separable Convolution 之前,先来複习一下传统 Convolution 是如何运作的。

 

传统 Convlution

 

首先我们先举个例子,假如我们有一个 input 的尺寸为 32 * 32 * 2 的照片,我们希望透过传统的 Convolution 使得其输出为一个尺寸为 32 * 32

* 3

的 feature map,如下图:

 

而为了达到这个目的我们需要一个 size 为 K * K * 2 * 3 的 kernel,但其实我们也可以将这个 kernel 想像成为 3 个 K * K * 2 的 kernels,而 每个 kernel 对input 做完 convolution 之后会得到 output 的一层 channel feature map
,如下图:

一个 K * K * 2 的 kernel 对于 input 做完 convolution 之后会得到 output 之中的一层feature map(可以看颜色的对应)

因此在这样的情况下,我们可以计算出传统 Convolution 做完一次 convolution 的运算量:

 

K : kernel 的大小

 

M : Input 的 channel 数量 (e.g., 2)

 

N : Output 的 channel 数量 (e.g., 3)

 

F : Output feature 的大小 (e.g., 32)

 

Depthwise Separable Convolution

 

在複习完传统的 Convolution 之后,终于要正式介绍 MobilenetV1 中的主角,也就是 Depthwise Separable Convolution 了,而 Depthwise Separable Convolution 分成了两个部份,也就是 Depthwise convolution 以及 1×1 convolution (pointwise convolution),首先我们先讲解 Depthwise convolution

 

Depthwise convolution

 

顾名思义, Depthwise convolution 与传统 Convolution 的差别就是
“Depthwise

,也就是说:

 

对于 Input 中的每层 channel(depth) 各自单独做 Convolution

 

听起来有点抽象,因此我们看一下下面的示意图:

将 Input 的每层 channel 切开,并且各自做 convolution

在上图当中,跟传统的 Convolution 不一样的地方在于,我们讲一个 32 * 32 * 2 的 Input,切割成了 两个 32 * 32 * 1的 Input,
而这样切割之后原先我们 尺寸为 K * K * 2 的 Kernel 就可以简化为 K * K * 1的尺寸
,跟上面传统的 convolution 相比,应该看得出来 Depthwise 的方式减少了一定的运算量!

 

但是,不知道大家有没有发现,经过了 Depthwise convolution 之后,我们的 Output feature map 的尺寸依然是 32 * 32 * 2,而并非我们所想要的尺寸 32 * 32 * 3,因此接下来的工作就是交由 1×1 convolution (pointwise convolution) 了!

 

1×1 convolution (pointwise convolution)

 

1×1 convolution (pointwise convolution) 最主要的目的就是将经过 Depthwise convolution 后的 output feature map 转换成为我们所希望的 output 尺寸(在这个例子中为 32 * 32 * 3),因此我们先来看一下以下的示意图:

1×1 convolution (pointwise convolution),使得输出的尺寸跟我们预想的一样

K * K * M * F * F + M * N * F * F如上述一样,原先经过 Depthwise convoltion 的 output feature map 32 * 32 * 2,我们利用了 3 个 1 * 1 * 2 的 kernel 进行 convolution 之后,便可以得到一个尺寸为 32 * 32 * 3 的 output feature map,但是到这边可能大家会发现,这样做不就跟传统的 convolution 一样吗?

 

没错, 1×1 convolution (pointwise convolution) 所作的事情基本上跟传统 Convolution 一模一样,最主要的差别在于
1×1

这个部份:

 

1×1 相较于传统 K×K 的 convolution 可以减少 K² 的运算量

 

因此在经过了 Depthwise convolution 以及 1×1 convolution (pointwise convolution) 之后,我们依然可以得到我们原先所想要的 32 * 32 * 3 的 output feature map

 

而所需要的运算量:

 

K * K * M * F * F + M * N * F * F

 

K : kernel 的大小

 

M : Input 的 channel 数量 (e.g., 2)

 

N : Output 的 channel 数量 (e.g., 3)

 

F : Output feature 的大小 (e.g., 32)

 

大家有没有发现,在传统 Convolution 当中相乘的运算量,在经过了Depthwise Separable Convolution 之后,
中间有一项变成了加法

,这样看起来可能看不出来他们的差别,所以我们用刚刚的例子实际算一次

 

传统 Convolution 运算量:

 

K * K * 2 * 3 * 32 * 32 = 6144 * K²

 

Depthwise Separable Convolution 运算量:

 

K * K * 2 * 32 * 32 + 3 * 2 * 32 * 32 = 2048 * K² + 6144

 

这样看下来,就可以发现 Depthwise Separable Convolution 相比于传统 Convolution,减少了大量的运算量,却可以达到一样的目的了!

 

Experiments

 

讲了那幺多,可能大家难免会觉得有点空虚,因此我们直接看一下 MobilnetV1的实验结果:

 

在 ImageNet 的表现上,相比于 GoogleNet 以及 VGG16 , MobilenetV1 可以在差不多的準确度的情况下,大幅的降低运算量以及参数量!

 

总结

 

MobilenetV1 透过利用 Depthwise Separable Convolution 大幅的减少了过去使用传统 Convolution 的运算量,并且可以达到相同的準确度。

 

Reference

MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注