MobileNetV1架构解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: MobileNets基于一种流线型架构,使用深度可分离卷积构建轻量级深度神经网络。我们引入了两个简单的全局超参数,可以有效地在延迟和准确性之间进行权衡。这些超参数允许模型生成器根据问题的约束为其应用程序选择适当大小的模型。我们在资源和准确性权衡方面进行了大量实验,与其他流行的ImageNet分类模型相比,我们表现出了强大的性能。然后,我们展示了MobileNet在广泛的应用和用例中的有效性,包括目标检测、精细分类、人脸属性和大规模地理定位。
参考论文:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

1、简介

  MobileNets基于一种流线型架构,使用深度可分离卷积构建轻量级深度神经网络。我们引入了两个简单的全局超参数,可以有效地在延迟和准确性之间进行权衡。这些超参数允许模型生成器根据问题的约束为其应用程序选择适当大小的模型。我们在资源和准确性权衡方面进行了大量实验,与其他流行的ImageNet分类模型相比,我们表现出了强大的性能。然后,我们展示了MobileNet在广泛的应用和用例中的有效性,包括目标检测、精细分类、人脸属性和大规模地理定位。

  MobileNet模型可应用于各种识别任务,以实现高效的设备智能。

image-20220803200424571

2、Model Architecture

2.1 Depthwise Separable Convolution

  MobileNet模型基于深度可分离卷积,这是一种分解卷积的形式,将标准卷积分解为深度卷积和1*1的点卷积。对于MobileNet,深度卷积将单个滤波器应用于每个输入通道,然后,逐点卷积应用1*1卷积将输出与深度卷积相结合。

  标准卷积在一个步骤中将输入滤波并组合成一组新的输出。深度可分离卷积将标准的卷积层分解为两层来做:

  • 首先是各个通道单独做卷积运算,称之为Depthwise Convolution
  • 然后用一个1*1的标准卷积层进行各个通道间的合并,称之为Pointwise Convolution

  论文中原图如下所示:

image-20220803201346429

  论文中将标准卷积(a)分级为深度卷积(b)和1*1逐点卷积的图如下:

image-20220803201549326

2.2 Network Structure

  MobileNet结构建立在深度可分离卷积上,第一层是全卷积。MobileNet架构如下表所示,除过最后的全连接层,所有层后面都是BatchNorm和ReLU非线性激活函数,最后的全连接层没有非线性,并馈送到softmax层进行分类。将深度卷积和点卷积计算为单独的层,MobileNet有28层。

image-20220803202051799

3、传统卷积与深度可分离卷积图解

3.1 传统卷积

image-20220803202627239

  • 卷积核channel=输入特征矩阵channel
  • 输出特征矩阵channel-卷积核个数

3.2 Depthwise卷积

在这里插入图片描述

  • 卷积核channel=1
  • 输入特征矩阵channel=卷积核个数=输出特征矩阵channel
DW卷积中的每一个卷积核只会和输入特征矩阵的一个channel进行卷积计算,所以输出的特征矩阵就等于输入的特征矩阵。

3.3 Pointwise卷积

在这里插入图片描述

  Pointwise卷积和普通的卷积一样,只不过使用了1*1卷积核。

3.3 Depthwise Separable Convolution(深度可分离卷积)

  深度可分离卷积由Depthwise卷积和Pointwise卷积两部分组成

在这里插入图片描述

4、Width Multiplier: Thinner Models

  虽然基本MobileNet架构已经很小且延迟很低,但很多时候,特定用例或应用程序可能需要更小更快的模型。为了构造这些较小且计算成本较低的模型,我们引入了一个非常简单的参数α,称为宽度乘数。宽度倍增器α的作用是在每一层均匀地薄化网络。对于给定的层和宽度乘数α,输入通道数M变为αM,输出通道数N变为αN

5、Resolution Multiplier:Reduced Representation

  降低神经网络计算成本的第二个超参数是分辨率乘数ρ。我们将其应用于输入图像,然后通过相同的乘法器减少每个层的内部表示。

  表3显示了当架构收缩方法顺序应用于层时,层的计算和参数数量。第一行显示了全卷积层的Mult加法和参数,输入特征图的大小为14×14×512,核K的大小为3×3×512×512。

image-20220803203729286

6、模型计算量与精度之间的权衡

  首先,我们展示了具有深度可分离卷积的MobileNet与使用全卷积构建的模型相比的结果。在表4中,我们看到,与全卷积相比,使用深度可分离卷积在ImageNet上仅降低了1%的准确度,并在多个加法和参数上节省了大量成本。

image-20220803203851307

  表5显示,在类似的计算和参数数量下,使MobileNets变薄比使其变浅要好3%。

image-20220803204030629

  表6显示了使用宽度乘数α缩小MobileNet架构的精度、计算和尺寸权衡。精度平稳下降,直到在α=0.25时架构变得太小。

image-20220803204120758

  表7显示了通过使用降低的输入分辨率训练MobileNet,不同分辨率乘法器的精度、计算和大小权衡。精度在整个分辨率范围内平稳下降。

image-20220803204151086

7、模型搭建(Tensorflow2.0)

这里是手动搭建的,你也可以直接使用迁移学习相关的API。
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.keras.layers import DepthwiseConv2D,BatchNormalization,ReLU,Conv2D
from tensorflow.keras.layers import GlobalAvgPool2D,Dense
# 定义可分离卷积块结构
def depthwise_conv_block(inputs,pointwise_conv_filters,strides=(1,1)):
    x=DepthwiseConv2D((3,3),padding='same',strides=strides,use_bias=False)(inputs)
    x=BatchNormalization()(x)
    x=ReLU(6.0)(x)
    
    x=Conv2D(pointwise_conv_filters,kernel_size=(1,1),padding='same',use_bias=False)(x)
    x=BatchNormalization()(x)
    x=ReLU(6.0)(x)
    return x
# 定义MobileNet第一层普通卷积结构
def conv_block(inputs,filters,kernel_size=(3,3),strides=(1,1)):
    x=Conv2D(filters,kernel_size=kernel_size,strides=strides,padding='same',
             use_bias=False)(inputs)
    x=BatchNormalization()(x)
    x=ReLU(6.0)(x)
    return x
def mobilenet_v1(inputs,classes):
    # 第一层普通卷积
    #[32,32,3]=>[16,16,32]
    x=conv_block(inputs,32,strides=(2,2))
    # [16,16,32]=>[16,16,64]
    x=depthwise_conv_block(x,64)
    # [16,16,64]=>[8,8,128]
    x=depthwise_conv_block(x,128,strides=(2,2))
    # [8,8,128]=>[8,8,128]
    x=depthwise_conv_block(x,128)
    # [8,8,128]=>[4,4,256]
    x=depthwise_conv_block(x,256,strides=(2,2))
    # [4,4,256]=>[4,4,256]
    x=depthwise_conv_block(x,256)
    # [4,4,256]=>[2,2,512]
    x=depthwise_conv_block(x,512,strides=(2,2))
    # [2,2,512]=>[2,2,512]
    x=depthwise_conv_block(x,512)
    # [2,2,512]=>[2,2,512]
    x=depthwise_conv_block(x,512)
    # [2,2,512]=>[2,2,512]
    x=depthwise_conv_block(x,512)
    # [2,2,512]=>[2,2,512]
    x=depthwise_conv_block(x,512)
    # [2,2,512]=>[2,2,512]
    x=depthwise_conv_block(x,512)
    # [2,2,512]=>[1,1,1024]
    x=depthwise_conv_block(x,1024,strides=(2,2))
    # [1,1,1024]=>[1,1,1024]
    x=depthwise_conv_block(x,1024)
    # [1,1,1024]=>[1024,]
    x=GlobalAvgPool2D()(x)
    # [1024,]=>[classes,]
    x=Dense(classes,activation='softmax')(x)
    return x
这里顺便在CIFAR10数据集上面测试一下。
INPUT_WIDTH=32
INPUT_HEIGHT=32
N_CHANNELS=3
N_CLASSES=10
batch_size=128
epochs=10
inputs=tf.keras.Input(shape=(INPUT_WIDTH,INPUT_HEIGHT,N_CHANNELS))
outputs=mobilenet_v1(inputs,N_CLASSES)
model=tf.keras.Model(inputs=inputs,outputs=outputs)
model.summary()

image-20220803204420275

# 数据准备
(x_train,y_train),(x_test,y_test)=tf.keras.datasets.cifar10.load_data()
# 归一化
x_train,x_test=x_train/255.0,x_test/255.0
# 转为独热编码
y_train=tf.keras.utils.to_categorical(y_train,N_CLASSES)
y_test=tf.keras.utils.to_categorical(y_test,N_CLASSES)
# 模型编译
adam=tf.keras.optimizers.Adam(1e-4)
model.compile(optimizers=adam,loss='categorical_crossentropy',
              metrics=['accuracy'])
# 模型训练
history = model.fit(
    x_train,
    y_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_data=(x_test, y_test),
    validation_freq=1
)

image-20220803204521905

accuracy = history.history["accuracy"]
val_accuracy = history.history["val_accuracy"]
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(1, len(accuracy) + 1)
fig,ax = plt.subplots(1,2,figsize=(12,6)) # figsize=(width, height)
ax[0].plot(epochs, accuracy, "bo", label="Training accuracy")
ax[0].plot(epochs, val_accuracy, "b", label="Validation accuracy")
ax[0].set_title("Training and validation accuracy")
ax[0].legend()
ax[1].plot(epochs, loss, "bo", label="Training loss")
ax[1].plot(epochs, val_loss, "b", label="Validation loss")
ax[1].set_title("Training and validation loss")
ax[1].legend()

image-20220803204548647

References

Howard A G , Zhu M , Chen B , et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications[J]. 2017.

MobileNets(V1)简介及两个初步的代码实验

轻量级网络——MobileNetV1

MobileNet V1 网络结构的原理与 Tensorflow2.0 实现

MobileNets(V1)的Tensorflow实现

目录
相关文章
|
2天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
21 6
|
2天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
11 1
|
2天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
3天前
|
运维 Kubernetes Cloud Native
Kubernetes云原生架构深度解析与实践指南####
本文深入探讨了Kubernetes作为领先的云原生应用编排平台,其设计理念、核心组件及高级特性。通过剖析Kubernetes的工作原理,结合具体案例分析,为读者呈现如何在实际项目中高效部署、管理和扩展容器化应用的策略与技巧。文章还涵盖了服务发现、负载均衡、配置管理、自动化伸缩等关键议题,旨在帮助开发者和运维人员掌握利用Kubernetes构建健壮、可伸缩的云原生生态系统的能力。 ####
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
11天前
|
消息中间件 编解码 开发者
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
本文深入探讨了 Flutter 在屏幕适配、横竖屏切换及多屏协作方面的兼容架构。介绍了 Flutter 的响应式布局、逻辑像素、方向感知、LayoutBuilder 等工具,以及如何通过 StreamBuilder 和 Provider 实现多屏数据同步。结合实际应用场景,如移动办公和教育应用,展示了 Flutter 的强大功能和灵活性。
82 6
|
11天前
|
存储 SQL 缓存
AnalyticDB 实时数仓架构解析
AnalyticDB 是阿里云自研的 OLAP 数据库,广泛应用于行为分析、数据报表、金融风控等应用场景,可支持 100 trillion 行记录、10PB 量级的数据规模,亚秒级完成交互式分析查询。本文是对 《 AnalyticDB: Real-time OLAP Database System at Alibaba Cloud 》的学习总结。
32 1
|
8天前
|
弹性计算 Kubernetes Cloud Native
云原生架构下的微服务设计原则与实践####
本文深入探讨了在云原生环境中,微服务架构的设计原则、关键技术及实践案例。通过剖析传统单体架构面临的挑战,引出微服务作为解决方案的优势,并详细阐述了微服务设计的几大核心原则:单一职责、独立部署、弹性伸缩和服务自治。文章还介绍了容器化技术、Kubernetes等云原生工具如何助力微服务的高效实施,并通过一个实际项目案例,展示了从服务拆分到持续集成/持续部署(CI/CD)流程的完整实现路径,为读者提供了宝贵的实践经验和启发。 ####
|
5天前
|
监控 安全 应用服务中间件
微服务架构下的API网关设计策略与实践####
本文深入探讨了在微服务架构下,API网关作为系统统一入口点的设计策略、实现细节及其在实际应用中的最佳实践。不同于传统的摘要概述,本部分将直接以一段精简的代码示例作为引子,展示一个基于NGINX的简单API网关配置片段,随后引出文章的核心内容,旨在通过具体实例激发读者兴趣,快速理解API网关在微服务架构中的关键作用及实现方式。 ```nginx server { listen 80; server_name api.example.com; location / { proxy_pass http://backend_service:5000;
|
7天前
|
缓存 监控 API
探索微服务架构中的API网关模式
随着微服务架构的兴起,API网关成为管理和服务间交互的关键组件。本文通过在线零售公司的案例,探讨了API网关在路由管理、认证授权、限流缓存、日志监控和协议转换等方面的优势,并详细介绍了使用Kong实现API网关的具体步骤。
24 3

推荐镜像

更多
下一篇
无影云桌面