MobileNet

博客主要介绍了MobileNet v1和v2模型。v1用深度级可分离卷积替代标准卷积,解决计算效率和参数量问题,有放弃pooling、采用stride = 2卷积等创新点,还可通过宽度乘数和分辨率乘数瘦身;v2引入shortcut结构,增加“扩张”卷积层,改用linear激活函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MobileNet v1标准模型

MobileNet的主要工作是用depthwise sparable convolutions(深度级可分离卷积)替代过去的standard convolutions(标准卷积)来解决卷积网络的计算效率和参数量的问题。

MobileNets模型基于是depthwise sparable convolutions(深度级可分离卷积),它可以将标准卷积分解成一个深度卷积一个点卷积(1 × 1卷积核)。

深度卷积将每个卷积核应用到每一个通道,而1 × 1卷积用来组合通道卷积的输出。

网络结构:

如上图所示,

  • 首先是一个3x3的标准卷积,然后后面就是堆积depthwise separable convolution,并且可以看到其中的部分depthwise convolution会通过strides=2(步长)进行down sampling(下采样)。
  • 然后采用average pooling(平均池化)将feature变成1x1,根据预测类别大小加上全连接层.
  • 最后是一个softmax层。如果单独计算depthwise convolution和pointwise convolution,整个网络有28层(这里Avg Pool和Softmax不计算在内)。

创新点:

1.放弃pooling直接采用stride = 2进行卷积运算

2.depthwise separable convolutions

它将standard convolutions(标准卷积)分解为depthwise convolution(深度卷积)和pointwise convolution(逐点卷积),它默认一种假设,使用分解后的卷积效果和标准卷积效果是近似的。

Standard convolutional与Depthwise Separeble convolutions网络结构对比:

 

举个栗子:

假设我们有一个输入图片

  • 这个输入图片的维度是11 x 11 x 3
  • 标准卷积为3 x 3 x 3 x 6(假设stride为2,padding为1)
  • 那么可以得到输出为6 × 6 × 6(6 = (11-3+2*1)/2+1)的输出结果

现在输入图片不变

  1. 先通过一个维度是3 × 3 × 1 × 3的深度卷积(输入是3通道,这里有3个卷积核分别作用在3个通道上),得到6 × 6 × 3的中间输出,
  2. 然后再通过一个维度是1 × 1 × 3 ×6的1 ×1卷积,同样得到输出为6 × 6 × 6。

depthwise separable convolution在计算量上与标准卷积的差别:

假定输入特征图大小是:

输出特征图大小是:

DF是特征图的width和height,这是假定两者是相同的。对于标准的卷积:

标准的卷积计算量将是:

而对于depthwise convolution计算量为:

而对于pointwise convolution计算量是:

1x1x

所以depthwise separable convolution总计算量是:

可以比较depthwise separable convolution和标准卷积如下:

一般情况下 N 比较大,那么如果采用3x3卷积核的话,depthwise separable convolution相较标准卷积可以降低大约9倍的计算量。


MoblieNets瘦身

有时候你需要更小的模型,那么就要对MobileNet瘦身了。

这里引入了两个超参数:width multiplier(宽度乘数)和 resolution multiplier(分辨率乘数)

宽度乘数:

第一个参数width multiplier主要是按比例减少通道数改变参数量,该参数记为α,其取值范围为(0,1],那么输入与输出通道数将变成αM和αN,对于depthwise separable convolution,其计算量变为:

分辨率乘数:

第二个超参数是分辨率乘数 ρ ,比如原来输入特征图是224x224,可以减少为192x192。分辨率乘数用来改变输入数据层的分辨率,同样也能减少参数。在 α 和 ρ 共同作用下,MobileNets某一层的计算量为:

resolution multiplier仅仅影响计算量,但是不改变参数量。其中,ρ 是隐式参数,ρ 如果为{1,6/7,5/7,4/7},则对应输入分辨率为{224,192,160,128}


MobileNet v2

Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation》 

与mobilenetV1 不同点:

1.引入了shortcut结构(残差网络)

2.在Depth-wise convolution之前多了一个1*1的“扩张”卷积层,目的是为了提升通道数,获得更多特征。(Inverted Residuals)

  1. 一般的的residuals block是先经过一个1*1的Conv layer,feature map降维,再经过3*3 Conv layer,最后经过一个1*1 的Conv layer,将feature map升维回去。
  2. 而 inverted residuals就是 先“扩张”,最后“压缩”。

3.pointwise结束之后弃用relu激活函数,改用linear激活函数,来防止relu对特征的破坏。(Linear Bottlenecks

  1. 公式:
  2. relu6一般在低精度运算中使用,在移动端设备中很受欢迎。和relu相比,relu6的输出被限制在了一个固定区间内。

综上:

网络结构:

参考:https://cuijiahua.com/blog/2018/02/dl_6.html & https://zhuanlan.zhihu.com/p/33075914

### MobileNet 模型架构及应用 #### 一、MobileNet 原理概述 MobileNet 是一种专为移动设备设计的轻量化卷积神经网络架构,其主要特点是通过减少计算复杂度来提高运行效率,同时保持较高的精度。该模型的核心在于引入了一种新的卷积操作——深度可分离卷积(Depthwise Separable Convolution),它显著降低了传统卷积运算中的参数数量和计算成本[^1]。 #### 二、MobileNet 架构详解 MobileNet 的基本构建单元是深度可分离卷积,这种卷积分两步完成: 1. **Depthwise Convolution**: 对输入通道逐个进行卷积操作,而不考虑不同通道之间的交互关系。这一步骤大幅减少了乘法次数。 2. **Pointwise Convolution**: 使用 $1 \times 1$ 卷积核将 Depthwise Convolution 输出的空间维度映射到更高的特征空间中,从而恢复跨通道的信息交流能力。 上述方法使得 MobileNet 能够在资源受限环境下高效执行复杂的视觉任务[^2]。 以下是基于 Python 和 TensorFlow 实现的一个简单版本 MobileNet 结构: ```python import tensorflow as tf from tensorflow.keras import layers, models def depthwise_separable_conv(input_tensor, filters, kernel_size=(3, 3), strides=(1, 1)): x = layers.DepthwiseConv2D(kernel_size=kernel_size, strides=strides, padding='same')(input_tensor) x = layers.BatchNormalization()(x) x = layers.ReLU()(x) x = layers.Conv2D(filters=filters, kernel_size=(1, 1), padding='same')(x) x = layers.BatchNormalization()(x) x = layers.ReLU()(x) return x def create_mobilenet(input_shape=(224, 224, 3), num_classes=1000): inputs = layers.Input(shape=input_shape) x = layers.Conv2D(32, (3, 3), strides=(2, 2), padding='same')(inputs) x = layers.BatchNormalization()(x) x = layers.ReLU()(x) # 添加多个深度可分离卷积层 x = depthwise_separable_conv(x, 64) x = depthwise_separable_conv(x, 128, strides=(2, 2)) x = depthwise_separable_conv(x, 128) x = depthwise_separable_conv(x, 256, strides=(2, 2)) # 更多层省略... x = layers.GlobalAveragePooling2D()(x) outputs = layers.Dense(num_classes, activation='softmax')(x) model = models.Model(inputs, outputs) return model model = create_mobilenet() model.summary() ``` #### 三、MobileNet 应用场景 由于 MobileNet 在性能与速度之间取得了良好的平衡,因此被广泛应用于多种实际场景中,特别是在移动端或嵌入式设备上的实时处理需求下表现优异。例如,在 SSD-MobileNet 中,MobileNet 被作为主干网络用来提取图像特征,而后续则由预测层负责目标检测的具体任务[^3]。 #### 四、总结 综上所述,MobileNet 不仅提供了一个有效的框架以解决资源有限条件下的计算机视觉问题,还因其灵活性能够适应不同的硬件环境以及多样化的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值