轻量化卷积神经网络-Mobile Net V1 简介

大纲

  1. Mobile Net V1简介
  2. 分组卷积
  3. 串联信息
  4. 分组+串联
  5. Mobile Net V1的深度可分离卷积
  6. 模型网络结构
  7. 代码实现

Mobile Net V1简介

随着2012年的AlexNet在ImageNet竞赛中获得冠军,越来越多的深度神经网络被人们提出,例如优秀的VGG系列、GoogleNet、Resnet系列等等。这些深度学习算法相较于传统机器学习分类算法而言,已经相当的出色,但是随着人们不断的加深网络,模型计算量产生的巨大存储压力和计算开销,已经开始严重影响深度神经网络在一些低功率领域的应用,例如ResNet系列中的ResNet152,网络层数已经达到152层,模型权重大小达到上百兆,这也使得我们几乎不可能在ARM芯片上跑ResNet152。

近些年,使用AI系统的机器人、无人驾驶、智能手机以及各类可穿戴设备的发展日新月异,急需一种能在算法层面有效的压缩存储和计算量的方法,使AI算法能在有限的计算平台上有效运转。而Mobile Net对传统卷积模块进行了改进,该结构更高效,为在移动设备上部署带来了可能。

Mobile Net V1是2017年Google发布的网络架构,正如其名,它是一种模型体积较小、可训练参数及计算量较少并适用于移动设备的卷积神经网络。旨在充分利用有限的计算资源,最大化模型的准确性,以满足有限资源下的各种应用案例,是部署至边缘侧常用的模型之一。mobileNet V1的主要创新点是用深度可分离卷积(depthwise separable convolution)代替普通的卷积,并使用宽度乘数(width multiply)减少参数量,它可在牺牲极少精度的同时去换取更好的数据吞吐量。

分组卷积

如果想要学习深度可分离卷积,首先要了解什么是分组卷积(Group Convolution),可以说,看懂了分组卷积,也就明白了什么是深度可分离卷积。分组卷积最早见于AlexNet,当时使用分组卷积的目的是将整个模型拆分成两块,这样就可以放到2个GPU上进行并行运算。

首先我们假设卷积的输入特征图尺寸为 W*H*C_{in} ,在padding为same,stride为1的情况下,输出特征图尺寸为 W*H*C_{out}

首先我们先看看标准卷积的计算:

如果使用标准卷积进行计算,我们可知,此时的理论计算量FLOPs为:

\begin{aligned} FLOPs=k_{w} * k_{h}*C_{in}*C_{out}*W*H\\ \end{aligned}\\

而分组卷积就是将输入的拆分为g个独立分组(假设可整除),分别进行卷及计算,可表示为:

  • 把输入特征图拆分为g组,每组尺寸为 W*H*(C_{in}/g)
  • 把输出特征图也拆分为g组,每组尺寸为 W*H*(C_{out}/g)
  • 按顺序对每组内的特征图做普通卷及计算,输出g个 W*H*(C_{out}/g) 的特征图,总的输出和最开始定义的 W*H*C_{out} 的输出尺寸一致。

此时我们的理论计算量FLOPs为:

\begin{aligned} FLOPs&=(k_{w} * k_{h}*C_{in}/g*C_{out}/g*W*H)*g\\ &=\frac{k_{w} * k_{h}*C_{in}*C_{out}*W*H}{g} \end{aligned}\\

串联信息

经过刚才的分组卷积计算,我们最终得到的输出虽然尺寸与原始假设的尺寸一致,并成功将理论计算量成果缩减了g倍,但是每一个分组之间并没有关联,不能共享信息,这是一个致命的缺陷,是我们所不能接受的。那么怎么才能让各个组之间进行信息整合呢?这时我们可以使用卷积核大小为(1,1)的普通卷积,在对上述所得结果进行一次卷积操作,这样就可以把原本不关联的信息串在一起整合起来。

此时我们的理论计算量FLOPs为:

\begin{aligned} FLOPs&=1 * 1*C_{in}*C_{out}*W*H\\ &=C_{in}*C_{out}*W*H \end{aligned}\\

分组+串联

把前面两节的计算合并在一起,我们就完成了一套先分组、后串联的双重卷积操作,这使我们在减少理论计算量的同时,还能保持卷积神经网络的可用性。那么首先,我们来计算一下分组+串联卷积的总理论计算量

\begin{aligned} FLOPs&=\frac{k_{w} * k_{h}*C_{in}*C_{out}*W*H}{g}+C_{in}*C_{out}*W*H\\ &=\frac{k_{w} * k_{h}*C_{in}*C_{out}*W*H+g*C_{in}*C_{out}*W*H}{g}\\ &=\frac{(C_{in}*C_{out}*W*H)*(k_{w} * k_{h}+g)}{g} \end{aligned}\\

我们来对比一下,普通卷积与分组+串联卷积的计算量差异有多少:

\begin{aligned} \frac{分组串联_{FLOPs}}{标准卷积_{FLOPs}}&=\frac{\frac{(C_{in}*C_{out}*W*H)*(k_{w}*k_{h}+g)}{g}}{k_{w}*k_{h}*C_{in}*C_{out}*W*H}\\ &=\frac{k_{w}*k_{h}+g}{k_{w}*k_{h}*g}\\ &=\frac{1}{k_{w}*k_{h}}+\frac{1}{g} \end{aligned}\\

由此可见,分组+串联卷积能极其有效的缩小理论计算量,并且在常用卷积核大小不变的情况下(常用卷积核为(3,3)),分组越多,缩小的理论计算量就也越多。

Mobile Net V1的深度可分离卷积

我们在一开始的时候提到过,Mobile Net V1的主要创新点是用深度可分离卷积(depthwise separable convolution)代替普通的卷积,而深度可分离卷积的核心思想在就于把普通卷积拆分为Depthwise+Pointwise两部分。其中Depthwise就对应着分组卷积,Pointwise就对应着串联信息。只不过,Mobile Net V1是分组卷积的极端表现,即“Group= C_{in} ”,也就是输入的每一个通道都单独当做一个组来计算。

让我们再次回顾一下之前所学的内容:

标准卷积的计算方式为:

Mobile NetV1中“Group= C_{in} ”,所以分组卷积的计算方式为:

串联部分的计算方式为:

最后Mobile Net V1的“分组Depthwise+串联Pointwise”的计算方式为:

大家现在是不是就对深度可分离卷积(depthwise separable convolution)一目了然了呢?

模型网络结构

Mobile Net V1相较于其他普通卷积神经网络最大的变化就是使用了深度可分离卷积,也就是将曾经的1层卷积拆分为2步来做,并且BN层和激活层也都要做两遍:

Mobile Net V1的网络结构其实与VGG网络类似,都是一条主线叠加到底:

代码实现

深度可分离卷积既然这么好使,那在代码中该如何实现呢?其实很简单,人家早就把这个操作写进深度学习框架里了,让我们以Keras为例(torch里也有对应的):

SeparableConv2D:

keras.layers.SeparableConv2D(filters, kernel_size, strides=(1, 1), padding='valid',
    data_format=None, dilation_rate=(1, 1), depth_multiplier=1, activation=None, 
    use_bias=True, depthwise_initializer='glorot_uniform',      pointwise_initializer='glorot_uniform', 
    bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, 
    bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, 
    pointwise_constraint=None, bias_constraint=None)

SeparableConv2D这个api可以直接实现整个深度分离卷积过程,即分组+串联的全过程。

DepthwiseConv2D:

keras.layers.DepthwiseConv2D(kernel_size, strides=(1, 1), padding='valid', 
    depth_multiplier=1, data_format=None, dilation_rate=(1, 1), activation=None, 
    use_bias=True, depthwise_initializer='glorot_uniform', bias_initializer='zeros', 
    depthwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, 
    depthwise_constraint=None, bias_constraint=None)

DepthwiseConv2D这个api则是单独计算分组(Depthwise)卷积部分。

Conv2D:

keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', 
    data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, 
    kernel_initializer='glorot_uniform', bias_initializer='zeros', 
    kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, 
    kernel_constraint=None, bias_constraint=None)

卷积核为1的串联部分(Pointwise)则可直接用Conv2D来实现。

MobileNet:

keras.applications.mobilenet.MobileNet(input_shape=None, alpha=1.0, 
    depth_multiplier=1, dropout=1e-3, include_top=True, weights='imagenet', 
    input_tensor=None, pooling=None, classes=1000)

最好使的其实是这个,直接调取Keras中预训练好的MobileNet(V2也有),就可以啦。

附:

Keras中的预训练模型有这些:

未经同意,禁止转载!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354