MobileNet

博客先介绍Xception,它是inception V3的改进,引入深度可分卷积结构。MobileNet借用正常分离卷积形式。还阐述了深度可分卷积优点。最后对比MobileNet和MobileNet V2,指出V2引入残差模块,有反残差结构,且V2微结构中第二个PW后去掉ReLU6。

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

要看MobileNet先看Xception。Xception是inception V3的改进,具体是引入了深度可分卷积结构

  • 将传统的卷积操作分成两步,假设原来是3*3的卷积,那么depthwise separable convolution就是先用M个3*3卷积核一对一卷积输入的M个feature map,不求和,生成M个结果;然后用N个1*1的卷积核正常卷积前面生成的M个结果,求和,最后生成N个结果。
  •  Xception深度可分是利用了可分离卷积形式来改进inception V3,但是鉴于inception的结构,它成了先1*1点卷积,然后再深度分离通道卷积。而且它证明了不仅可以加快收敛,还能提高准确率,略微减少参数。而且还证明了在通道depthwise conv后紧接非线性激活层不好(可能是因为这里的特征比较低维。
  • MobileNet则不同,它是借用了正常的分离卷积形式,即先通道分离卷积,再pointwise conv.(先有了Xception后有MobielNet)
标题

深度可分卷积:标准卷积是将通道方向和空间方向上同时考虑,而深度可分就是先进行通道方向的卷积,再进行深度方向上卷积。优点:减少参数及计算量,实验发现还可以提高分类精度。

MobileNet和MobileNet V2的区别:

首先V1中是直接深度分离卷积(带RelU6激活),然后深度方向点卷积(带RelU6激活)。

而V2中则引入了残差模块,然后在模块内又先对输入进行1*1核升维,然后深度分离卷积(激活),再点卷积(linear,无激活,这里后面又接1*1升通道,因此这个点卷积得到的特征图是瓶颈(最窄的地方)!)。

因此之所以可以1*1是因为实验发现图像特征复用有很大益处,其次是因为深度分离卷积带来的参数量的降低的前提。因此这个反残差模块是类似两头宽中间窄的形状,与残差模块的先1*1降通道,再标准卷积,再1*1升通道不同(没有depthwise这种形式,只能这样做来降低参数量)。

 LInear  Bottlenecks:MobileNet V2 微结构中第二个PW后去掉 ReLU6。对于低维空间而言,进行线性映射会保存特征,而非线性映射会破坏特征。

 

 

### 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、付费专栏及课程。

余额充值