使用TensorFlow官方提供的API进行模型训练,keras系列API中,存在很多算法,使用MobileNetV2进行讲解。
一. MobileNetV2简介
MobileNetV2 是由 Google 在 2018 年发布的一种轻量级深度神经网络架构,旨在优化移动设备和嵌入式设备上的图像分类和其他视觉任务的性能。它是 MobileNet 系列的第二代改进版本,相较于 MobileNetV1,引入了新的层类型和架构改进,显著提升了模型的准确性和效率。
1. 主要特性和创新点
深度可分离卷积(Depthwise Separable Convolutions):
延续了 MobileNetV1 的设计,通过深度可分离卷积来减少参数量和计算量。深度可分离卷积将标准卷积分解为深度卷积和逐点卷积两个步骤,极大地减少了计算成本。
线性瓶颈(Linear Bottlenecks):
引入了线性瓶颈层,在每个模块的输入和输出使用低维线性空间。这有助于减少模型复杂度和计算量,同时避免信息丢失。
倒残差结构(Inverted Residuals):
引入了倒残差结构,与 ResNet 中的残差模块相反,MobileNetV2 中的残差连接在高维卷积层而不是低维层之间进行。
倒残差块结构通过扩展-深度卷积-压缩的过程来捕获更多的信息。
2. 架构细节
MobileNetV2 的架构由一系列倒残差块和普通卷积层组成:
Conv2D:初始标准卷积层,通常使用 3x3 卷积核。
Bottleneck Residual Blocks:包含扩展、深度可分离卷积和线性压缩。
每个瓶颈块通常包括:1x1 卷积(扩展通道数) -> 3x3 深度卷积 -> 1x1 卷积(压缩通道数)。
引入 ReLU6 激活函数用于非线性变换。
全局平均池化(Global Average Pooling):将所有的空间维度平均化。
全连接层(Fully Connected Layer):输出最终的分类结果。
3. 优点
高效性:大幅减少了参数和计算量,非常适合资源受限的移动和嵌入式设备。
模块化设计:灵活性高,可以根据不同任务和需求进行调整和裁剪。
较高准确性:在保持计算效率的同时,提供了与更复杂模型相近的分类准确性。
二. 核心API介绍
简单示例代码:
python
import keras
from keras import layers
# 构建 MobileNet 模型
base_model = keras.applications.MobileNetV2((224, 224, 3), include_top=False)
# 将模型的主干参数进行冻结
base_model.trainable = False
model = keras.Sequential([
# 归一化处理
layers.Rescaling(1. / 127.5, offset=-1, input_shape=(224, 224, 3)),
# 设置主干模型
base_model,
# 对主干模型的输出进行全局平均池化
layers.GlobalAveragePooling2D(),
# 通过全连接层映射到最后的分类数目上
layers.Dense(10, activation='softmax')
])
1. keras介绍
Keras 是一个高级神经网络 API,用 Python 编写,能够运行在 TensorFlow、Theano 和 CNTK 等多个深度学习框架之上。它由 François Chollet 开发,旨在实现快速实验,支持快速构建和训练深度学习模型。Keras 的主要优势包括易用性、模块化和可扩展性,使其成为研究人员和开发人员构建和测试深度学习模型的流行选择。
2. layers介绍
在 Keras 中,layers 是神经网络的基本构建块。每一个层将输入数据转换为输出数据,并包含可训练的权重。Keras 提供了多种类型的层,用于构建不同类型的神经网络,包括全连接层、卷积层、池化层、循环层等。
3. MobileNetV2参数介绍
- input_shape: 输入图像的形状,默认是 (224, 224, 3)。
- alpha: 控制网络的宽度。alpha 的取值在 (0, 1] 之间。例如,当 alpha=1.0 时,表示使用原始网络宽度;当alpha=0.5 时,表示将网络每一层的滤波器数量减半。
- depth_multiplier: 控制深度可分离卷积的深度(默认值为 1)。
- include_top: 是否包含网络的顶层全连接层。默认值是 True,用于包含顶层全连接层;设置为 False,可以在迁移学习中使用。
- weights: 指定预训练权重,选项包括 None(随机初始化权重),'imagenet'(使用在 ImageNet 上训练的权重)。
- input_tensor: 可选的 Keras 张量(即输出为模型输入的层),用于作为模型的输入。
- pooling: 当 include_top 设置为 False 时,该参数指定模型的全局池化模式。选项包括: None:不应用额外的全局池化。 'avg': 全局平均池化。 'max': 全局最大池化。
- classes: 分类数,即输出的神经元数量(只在 include_top=True 时有用)。
- classifier_activation: 顶层分类器的激活函数。默认值是 'softmax'。设置为 None 时,返回原始 logits。
4.Rescaling(1. / 127.5, offset=-1, input_shape=(224, 224, 3))
假设输入数据的像素值范围是 [0, 255],则经过这个 Rescaling 层后,这样就可以将输入数据从 [0, 255] 范围归一化到 [-1, 1] 范围。