使用移动设备直接更新深度学习模型 - 迁移学习和微调
发表于 2023-03-29 10:31:07

骁龙和 Qualcomm 品牌产品是 Qualcomm Technologies, Inc.和/或其子公司的产品。

“这个模型不错,要是能在用户设备上直接微调就更好了。”对于在云端训练的机器学习模型,您是否也有这样的想法?

现在您的愿望实现了。

我们发布了一个迁移学习工具包,包含在 Qualcomm Adreno OpenCL 机器学习 SDK v.3.0 中。您可以按照 SDK 中的示例,使用预训练的 MobileNet V1 模型,并在部署到移动设备后重新训练。本文将介绍迁移学习以及如何测试迁移学习的一种有用的变体 - 微调。

移动设备上的迁移学习 

在上一篇讲解有关边缘 ML 训练的文章中,我提到使用 OpenCL ML SDK 可以让您在移动设备上完成训练。它为您提供了通过训练传递来更新权重的微调预训练模型的选项。实现迁移学习和微调的核心功能是 Adreno GPU OpenCL 驱动程序的 cl_qcom_ml_ops扩展。

此外,我还提到了迁移学习,您首先使用在云端训练的模型,然后通过边缘训练调整特定层的权重进行更新。之所以称之为“迁移学习”,是因为它可以使模型知识在数据领域之间进行传递。

微调:使模型适应新数据,而无需重新训练每个层

新模型可以通过多种方式使用迁移学习进行微调。一种常见的方法是冻结预训练模型的图层权重,并且仅在训练期间更新新添加的图层的权重。

通过微调,您可以冻结所有预训练层(其中一个除外)的权重。然后,使用边缘训练更新每个预训练层的权重。通过微调,您可以使模型适应初始训练期间不可用的数据。新数据可能仅在您部署模型的网络边缘可用,而不是在训练模型的位置。

例如,您可以先从云端开始训练模型,将图像分类为各个类别。之后,当用户带着移动设备前往澳大利亚内陆旅行时,可以更新模型(即,迁移知识),对本地的野花进行分类。

我们在工具包中包含的示例采用了包含微调的迁移学习。

我们的微调示例

本示例说明了如何使用 OpenCL ML SDK 进行迁移学习和微调。目标是从预训练的 MobileNet V1 模型开始,然后重新训练,以实现对花卉的分类。

  • 我们的示例是基于预训练的 Keras MobileNet V1 模型的迁移学习和微调模型。预训练模型使用 ImageNet 数据集进行训练,该数据集包括有 1 千个对象类别的 1,281,167 个训练图像。
  • Keras 提供 API,用于加载 MobileNet V1 预训练的 ImageNet 模型,而不需要终端层执行输入图像到 ImageNet 对象类的最终分类。MobileNet V1 模型没有分类层的部分称为特征提取器 (FE)。

因此,我们的模型以 MobileNet V1 FE 开始。但在本微调示例中,我们将分类层替换为四个不同的层:average_pooling2d、flatten、dense、softmax

_________________________________________________________
Layer (type)                     Output Shape            Param #
==============================================
mobilenet_1.00_224       (None, 7, 7, 1024)     3228864
(Functional)
average_pooling2d          (None, 1, 1, 1024)     0
(AveragePooling2D)
flatten (Flatten)                (None, 1024)             0
dense (Dense)                  (None, 5)                   5125
softmax (Softmax)            (None, 5)                  0
===============================================
Total params: 3,233,989
Trainable params: 1,053,701
Non-trainable params: 2,180,288

列出的第一层 MobileNet_1.00_224 是不带 ImageNet 分类器的基本 MobileNet V1 模型 (FE)。另外四个层(average_pooling2d、flatten、dense、softmax)是新添加的层,构成花卉数据集中五个类别的分类器。

冻结层

本示例中,微调冻结 MobileNet V1 FE 中的层,但最终卷积图层 (conv_pw_13) 除外。密集层使用新值进行初始化,并与来自 MobileNet V1 FE 的 conv_pw_13 一起训练。

以下是 MobileNet V1 FE 中包括 conv_pw_13 layer 的相关部分的摘要:

conv_dw_13_relu (ReLU)      (None, 7, 7, 1024)        0
conv_pw_13 (Conv2D)         (None, 7, 7, 1024)        1048576
conv_pw_13_bn                   (None, 7, 7, 1024)        4096
(BatchNormalization)
conv_pw_13_relu (ReLU)      (None, 7, 7, 1024)         0
==========================================================
Total params: 3,228,864
Trainable params: 1,048,576
Non-trainable params: 2,180,288
___________________________________________________________

适应和结果

TensorFlow 花卉数据集包含 3670 个标记数据点,是一个相对较小的数据集。经过 80/20 分割,我们得到了 2934 个训练样本和 736 个测试样本。

初始测试精度为 147/736(或 19.9728%)。鉴于有 5 个类别,这样的测试精度相当于均匀随机猜测。

我们将 2934 个训练样本按每个训练轮数分成 18 个批次,每个批次 163 个样本。然后使用数据重排和学习率 0.003 进行 100 轮的训练。我们实现了 670/736(或 91.0326%)的测试精度。

有关更多详细信息,请参阅 OpenCL ML SDK 中的 clml_mobilenet_transfer_learning 示例。

其他用例

如需回顾我们强调的方法,您可以在基于服务器的高性能 GPU 或云端开发和训练基线模型。使用 OpenCL ML SDK,您可以部署迁移学习模型。在用户的移动设备上运行的应用程序将使用设备传感器生成的各种数据(包括相机)逐步更新模型。正如本示例所示,可以在不需要重新训练新模型中每一层的情况下,增量、持续的完成更新。

借助微调,可以使用特定用户唯一的数据对基线模型进行个性化设置。我在上一篇文章中还提到了视频会议中的个性化用例。想象一下使用迁移学习训练模型,可以在任何时候识别正在发言的参与者,以从可以模糊其背景。其他有前景的用例包括语音识别、照明条件和自然语言处理 (NLP)。在这些领域,您可以根据仅在设备边缘可用的数据调整模型行为,因此非常适合迁移学习。

下一步

下载最新的 Adreno OpenCL 机器学习 SDK其中包含了示例、详细文档和本文演示使用的工具包。在移动设备上部署后,先亲自试用一下微调模型。

如需更深入地了解(针对猫狗而不是野花),请阅读 Keras 指南“迁移学习与微调整”。

Qualcomm 品牌产品是 Qualcomm Technologies, Inc.及其子公司的产品。

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】