MobileNet

某厂实习生 有的图转载csdn和知乎,仅作自己笔记,侵删   

一、解决什么问题

目前模型受限的原因 主要是模型的存储问题和模型进行预测的速度问题

有两种常用的解决手段:模型结构设计和模型压缩。

模型结构设计:主要思想在于设计更高效的「网络计算方式」(主要针对卷积方式),从而使网络参数减少的同时,不损失网络性能。

模型压缩(Model Compression ):即在已经训练好的模型上进行压缩,使得网络携带更少的网络参数,从而解决内存问题,同时可以解决速度问题。

模型压缩多用剪枝量化蒸馏,下面主要说模型结构设计。

二、模型结构设计基础知识

(1)人工设计轻量化神经网络模型;

(2)基于神经网络架构搜索(Neural Architecture Search,NAS)的自动化设计神经网络;

(3)CNN模型压缩;

(4)基于AutoML的自动模型压缩。

 

1.1 标准卷积

图1标准卷积计算图

HxW表示输入特征图空间尺寸(如图1所示,H和W代表特征图的宽度和高度,输入和输出特征图尺寸不变),N是输入特征通道数,KxK表示卷积核尺寸,M表示输出卷积通道数,则标准卷积计算量是HWNK²M。

图2标准卷积计算过程

如图3所示标准卷积在空间维度和通道维度直观说明,输入特征图和输出特征图之间连接线表示输入和输出之间的依赖关系。以conv3x3为例子,输入和输出空间“spatial”维度密集连接表示局部连接;而通道维度是全连接,卷积运算都是每个通道卷积操作之后的求和(图2),和每个通道特征都有关,所以“channel”是互相连接的关系

图3标准卷积:空间维度和通道维度示意图

1.2 Grouped Convolution

分组卷积是标准卷积的变体,其中输入特征通道被为G组(图4),并且对于每个分组的信道独立地执行卷积,则分组卷积计算量是HWNK²M/G,为标准卷积计算量的1/G。

图 4分组卷积:空间维度和通道维度示意图

Alex采用Group convolution将整个网络分成两组后,分别放入一张GPU卡进行训练(如图5所示)。

图5 AlexNet网络架构

1.3 Depthwise convolution 逐通道卷积

Depthwise convolution是指将NxHxWxC输入特征图分为group=C组(既Depthwise 是Grouped Convlution的特殊简化形式),然后每一组做k*k卷积,计算量为HWK²M(是普通卷积计算量的1/N,通过忽略通道维度的卷积显著降低计算量)。Depthwise相当于单独收集每个Channel的空间特征。

图6 depthwise卷积

图7 Depthwise卷积:空间维度和通道维度示意图

1.4 pointwise convolution 逐点卷积

Pointwise是指对NxHxWxC的输入做 k个普通的 1x1卷积,如图8,主要用于改变输出通道特征维度。Pointwise计算量为HWNM。

Pointwise卷积相当于在通道之间“混合”信息。

图8 Pointwise卷积

图9 Pointwise卷积:空间维度和通道维度示意图

1.5 Channel Shuffle

Grouped Convlution导致模型的信息流限制在各个group内,组与组之间没有信息交换,这会影响模型的表示能力。因此,需要引入group之间信息交换的机制,即Channel Shuffle操作。

Channel shuffle是ShuffleNet提出的(如图 5 AlexNet也有Channel shuffle机制),通过张量的reshape 和transpose,实现改变通道之间顺序。

图10 Channel shuffle:空间维度和通道维度示意图

如图10所示Channel shuffle G=2示意图,Channel shuffle没有卷积计算,仅简单改变通道的顺序。

1.6 深度可分离卷积主要分为两个过程,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)。

 

1.7空间可分卷积将一个内核简单地分为两个较小的内核。 最常见的情况是将3x3内核分为3x1和1x3内核

三、人工设计神经网络

MobileNet V1&V2,ShuffleNet V1&V2有一个共同的特点,其神经网络架构都是由基本Block单元堆叠,首先分析基本Block架构的异同点,再分析整个神经网络的优缺点,对比MobileNet V1&V2,ShuffleNet V1&V2模型(图17),手工设计轻量化模型主要得益于depth-wise convolution减少计算量,而解决信息不流畅的问题,MobileNet 系列采用了 point-wise convolutionShuffleNet 采用的是 channel shuffle

 

MobileNet V1

模型设计:

MobileNet V1是Google第一个提出体积小,计算量少,适用于移动设备的卷积神经网络。MobileNet V1之所以如此轻量,背后的思想是用深度可分离卷积(Depthwise separable convolution)代替标准的卷积,并使用宽度因子(width multiply)减少参数量。

深度可分离卷积把标准的卷积因式分解成一个深度卷积(depthwise convolution)和一个逐点卷积(pointwise convolution)。

计算量:

为了进一步降低Mobilenet v1计算量,对输入输出特征通道数M和N乘以宽度因子α(α∈(0,1),d典型值0.25,0.5和0.75),深度可分离卷积总计算量可以进一降低为:

ShuffleNet V1

模型设计:

ShuffleNet是Face++提出的一种轻量化网络结构,主要思路是使用Group convolution和Channel shuffle改进ResNet,可以看作是ResNet的压缩版本

图13展示了ShuffleNet的结构,其中(a)就是加入BatchNorm的ResNet bottleneck结构,而(b)和(c)是加入Group convolution和Channel Shuffle的ShuffleNet的结构。

 

图14 ShuffleNet V1 Block:空间维度和通道维度示意图

如所示,ShuffleNet block最重要的操作是channel shuffle layer,在两个分组卷积之间改变通道的顺序,channel shuffle实现分组卷积的信息交换机制。

计算量:

ResNet bottleneck计算量:

ShuffleNet stride=1计算量:

对比可知,ShuffleNet和ResNet结构可知,ShuffleNet计算量降低主要是通过分组卷积实现。ShuffleNet虽然降低了计算量,但是引入两个新的问题:

1、channel shuffle在工程实现占用大量内存和指针跳转,这部分很耗时。

2、channel shuffle的规则是人工设计,分组之间信息交流存在随意性,没有理论指导。

MobileNet V2

模型设计:

MobileNet V1设计时参考传统的VGGNet等链式架构,在反向传播时梯度消失。于是改进版的MobileNet V2[3]增加skip connection,并且对ResNet和Mobilenet V1基本Block如下改进:

图15 Mobile V1, Mobile V2,RsNet架构对比

  • 继续使用Mobilenet V1的深度可分离卷积降低卷积计算量。
  • 增加skip connection,使前向传播时提供特征复用。
  • 在Depth-wise Separable Convolution前面添加一个Point-wise Convolution。通过PW操作升维,在高维特征空间中提取特征。
  • 去掉Depth-wise Separable Convolution后面的ReLU
  • 采用Inverted residual block结构。该结构使用Point wise convolution先对feature map进行升维,再在升维后的特征接ReLU,减少ReLU对特征的破坏。
  • 使用RELU6激活层 ReLU6 就是普通的ReLU但是限制最大输出值为 6,这是为了在移动端设备 float16/int8 的低精度的时候,也能有很好的数值

 

ShuffleNet V2

ShuffleNet V2 引入通道分割(channel split)操作, 将输入的feature maps分为两部分:一个分支为shortcut流,另一个分支含三个卷积(且三个分支的通道数一样)。分支合并采用拼接(concat),让前后的channel数相同,最后进行Channel Shuffle(完成和ShuffleNet V1一样的功能)。元素级的三个运算channel split、concat、Channel Shuffle合并一个Element-wise,显著降低计算复杂度

来自 <轻量化神经网络综述 - 知乎>

四、使用自动网络搜索

NasNet   实现准确率state-of-art水平,但是推断延时较大,在移动端对实时性苛刻场景难以大规模运用。

MnasNet  Google提出的探索了一种使用强化学习设计移动端模型的自动化神经架构搜索方法,并且实现准确率和运算速率突破

五、MobileNetV3

从SqueezeNet开始模型的参数量就不断下降,为了进一步减少模型的实际操作数,MobileNetV1利用了深度可分离卷积提高了计算效率,而MobileNetV2则加入了线性bottlenecks和反转残差模块构成了高效的基本模块。随后的ShuffleNet充分利用了组卷积和通道shuffle进一步提高模型效率。CondenseNet则学习保留有效的dense连接在保持精度的同时降低,ShiftNet则利用shift操作和逐点卷积代替了昂贵的空间卷积。

MobileNetV3有两大创新点   高通没有支持MobileNetV3

(1)互补搜索技术组合:由资源受限的NAS执行模块级搜索,NetAdapt执行局部搜索。

(2)网络结构改进:将最后一步的平均池化层前移并移除最后一个卷积层,引入h-swish激活函数。

MobileNetV3分为Large和Small两个版本,Large版本适用于计算和存储性能较高的平台,Small版本适用于硬件性能较低的平台。

Large版本共有15个bottleneck层,一个标准卷积层,三个逐点卷积层。

Small版本共有12个bottleneck层,一个标准卷积层,两个逐点卷积层。

MobileNetV3中引入了5×5大小的深度卷积代替部分3×3的深度卷积。引入Squeeze-and-excitation(SE)模块和h-swish(HS)激活函数以提高模型精度。结尾两层逐点卷积不使用批规范化(Batch Norm)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MobileNet 是一种轻量级的深度学习模型,专为移动设备和嵌入式系统设计,以减少计算资源和内存占用,同时保持较高的性能。它是 Google 在 2017 年 ICLR 大会上提出的,由 Inception 模型发展而来,但采用了深度可分离卷积(Depthwise Separable Convolution)来大幅度减少参数数量。 在 Keras 中,你可以使用 `tf.keras.applications.MobileNet` 或 `keras.applications.mobilenet_v2.MobileNetV2` 来导入预训练的 MobileNet 模型。这个模型通常包括以下几个部分: 1. **输入层**:接受图像数据作为输入。 2. **卷积层**:包括深度可分离卷积层,它们分别对空间维度和通道维度进行操作,大大减少了参数数量。 3. **瓶颈层**:使用扩张路径(Expanded Path),包含一个深度可分离卷积后接一个1x1卷积来增加通道数。 4. **全局平均池化**(Global Average Pooling):代替全连接层,减少过拟合并使网络更易于部署。 5. **分类层**:如 `tf.keras.layers.Dense`,用于输出分类结果。 如果你想要在 Keras 中使用 MobileNet,可以直接加载预训练权重,然后可以选择冻结部分层进行微调,或者从头开始训练。以下是使用 Keras 导入 MobileNet 的基本步骤: ```python from tensorflow.keras.applications import MobileNet from tensorflow.keras.models import Model from tensorflow.keras.layers import Dense, GlobalAveragePooling2D # 加载预训练模型 base_model = MobileNet(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3)) # 添加全局平均池化和全连接层进行分类任务 x = base_model.output x = GlobalAveragePooling2D()(x) predictions = Dense(num_classes, activation='softmax')(x) # 创建新的模型 model = Model(inputs=base_model.input, outputs=predictions) # 选择是否训练或冻结预训练层 if fine_tuning: # 冻结所有层 for layer in base_model.layers: layer.trainable = False # 再定义几个顶部的层进行微调 num_frozen_layers = len(base_model.layers) - num_top_layers_to_freeze for layer in model.layers[:num_frozen_layers]: layer.trainable = False else: # 训练整个模型 model.trainable = True ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值