大家好
0
上月底我组织了【组队学习】TensorFlow 入门课程(中文),截至目前有300多同学加入。
学习内容是
- TensorFlow 部署简介
- TensorFlow Lite简介
- 在 Android app 使用TensorFlow Lite
- 在 iOS app 使用TensorFlow Lite
- 使用TensorFlow Serving 部署
主要就是 TensorFlow Lite
、TensorFlow.js
和 TF Serving
的实操,其实今年3月份我就接触 TensorFlow.js
了,当时还写了一篇入门教程:TensorFlow.js 用浏览器玩机器学习,9月在谷歌开发者大会上,我还亲身体验了这些黑科技,非常奇妙。
但是作为一个对安卓开发一无所知的人,我也想尝试借助 TensorFlow Lite 在 Android 和 iOS 上部署并使用机器学习模型。Learn by doing是我最推崇的学习方法,所以就跟着课程第二章和第三章code了一下,收获满满,本文即为我做的学习笔记。
TensorFlow Lite 简介
TensorFlow Lite 是一种在设备端运行 TensorFlow 模型的开源深度学习框架。移动开发要求轻量、低延迟、高效、隐私保护、省电,Lite很好满足了以上要求。
TensorFlow Lite 实现也很简单,最核心的是转化并保存模型、加载TFLite模型并配置张量。
训练、保存TF模型
这一步再细分为5小步,分别是,获取数据、获取基础模型、构建模型、训练模型、保存模型。
基础模型可以直接去 TensorFlow Hub 获取
https://hub.tensorflow.google.cn/
可以在页面左侧选择想要的模型类别、格式、TF版本、是否支持微调等等,也可以直接搜索。
比如图像分类,可以使用mobilenet_v2这个模型,点击下载即可。也可以复制链接,通过hub.KerasLayer方法下载。
剩下的步骤大家应该很熟悉了,训练好的模型,用tf.saved_model.save方法保存模型即可,推荐SavedModel格式。
加载TFLite模型并配置张量
这一步细分为3小步
将模型格式转换TFLite格式,转化可以使用TFLiteConverter方法,保存就是普通的文件写入操作,注意格式是.tflite。
加载TFLite并配置张量也非常简单,使用Interpreter方法就行了。
正式项目中使用测试集进行测试也是必须的,查看准确率等评价指标是否还在接受范围内。
TFLite还提供了模型优化方法converter.optimizations,可以使模型更小巧。
TFLite Model Maker
借助 TensorFlow Lite Model Maker 库,可以简化使用自定义数据集训练 TensorFlow Lite 模型的过程。该库使用迁移学习来减少所需的训练数据量并缩短训练时间。目前支持图像分类、文字分类、音频、BERT问答等任务。使用很简单,先安装
pip install tflite-model-maker
借助 Model Maker,仅仅通过几行代码即可使用自定义数据集训练 TensorFlow Lite 模型。例如,以下就是训练图像分类模型的步骤。
data = ImageClassifierDataLoader.from_folder('flower_photos/') train_data, test_data = data.split(0.9) model = image_classifier.create(train_data) loss, accuracy = model.evaluate(test_data) model.export(export_dir='/tmp/')
TFLite Model Maker 给了我们更多的模型创建的可选项。
实践:使用Android Studio 开发一个TFLite模型的微型APP
先安装Android Studio ,它是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。
下载地址:https://developer.android.google.cn/studio
另外我们还能顺手从0开始接触一下Kotlin,这是谷歌推荐使用的Andriod App开发语言。
1
先熟悉一下流程,New一个Project,选Empty Activity
项目配置页只重命名项目名称即可,其他不用管,等待初始化完成即可。
2
编写布局,我们的重点不是界面设计和实现,了解流程即可。不过后期也可以学习一下Android界面布局基础知识。
3
最核心的是添加TFLite依赖这一步,因为TFLite不是Android自带的API,需要使用Gradle构建工具引入TensorFlow Lite外部链接库。注意,Android工程中有两个gradle文件,我们需要的是App及的build.gradle文件。
在dependencies 中添加三个implementation即可(注意版本号)
然后再android配置项添加aaptOptions(安卓资源打包工具),配置为不要压缩TFLite文件,否则无法使用。
配置完成后点击右上角立即同步,等待完成即可。
下一步是切换为工程视角,在app-src目录下新建一个Assets 文件夹,模型会放到这里,直接把模型paste进来就行了。
最后一步就比较复杂和关键了——--使用模型
步骤:加载模型、实例化解释器、获取输入数据并格式化模型需要的数据类型、构造存放输出数据的数据结构、使用模型进行推理、获取结果显示在界面上
加载模型这部分代码写在app-src-main-java下MainActivity文件中
到这里才出现第一个难点,需要用Kotlin写一个loadModelFile函数来加载模型
实例化解释器在MainActivity文件类级别加入模型和解释器的声明,这里调用了上一步中的loadModelFile函数,把assets下的模型读入到tflitemodel对象,然后将tflitemodel作为参数实例化解释器,赋值给解释器对象tflite。
获取输入数据并格式化模型需要的数据类型
还记得加载TFLite模型并配置张量这一步吗,有一个获取输入interpreter.get_input_detailes详细信息的步骤。记下输入输出信息的shape和dtype
在kotlin中使用getInputTensor结构可以实现类似的效果
然后完成数据数据的格式化,这一步也超纲了,需要后续补充相关知识才能理解。
构造存放输出数据的数据结构
和上面类似,input改为output,不再重复。
使用模型进行推理
模型推理代码就简单了,把输入和输出数据对象作为参数放进run方法就行了
获取结果显示在界面上
将获取到的ByteBuffer转化为浮点型数据弹窗显示,主要就是定义这个弹窗。其实这部分对应界面设计和实现,也需要后续补充知识才能理解。
完整代码在:https://github.com/lmoroney/tfbook
后续准备认真学习一下,不过我不太喜欢学习一大堆基础知识,准备尝试复刻并运行成功一个官方案例,然后在此基础上根据自己的需求和兴趣魔改一个新app,这样学的会更透彻。
感兴趣的朋友可以点击阅读原文一起学啊。