本教程介绍如何使用 tf.Keras 时序 API 从头开始训练模型,将 tf.Keras 模型转换为 tflite 格式,并在 Android 上运行该模型。我将以 MNIST 数据为例介绍图像分类,并分享一些你可能会面临的常见问题。本教程着重于端到端的体验,我不会深入探讨各种 tf.Keras API 或 Android 开发。

下载我的示例代码并执行以下操作:

在 colab 中运行:使用 tf.keras 的训练模型,并将 keras 模型转换为 tflite(链接到 Colab notebook)。

在 Android Studio 中运行:DigitRecognizer(链接到Android应用程序)。

1.训练自定义分类器

加载数据

我们将使用作为tf.keras框架一部分的mnst数据。

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

预处理数据

接下来,我们将输入图像从 28x28 变为 28x28x1 的形状,将其标准化,并对标签进行 one-hot 编码。

定义模型体系结构

然后我们将用 cnn 定义网络架构。

def create_model():

# Define the model architecture

model = keras.models.Sequential([

# Must define the input shape in the first layer of the neural network

keras.layers.Conv2D(filters=32, kernel_size=3, padding='same', activation='relu', input_shape=(28,28,1)),

keras.layers.MaxPooling2D(pool_size=2),

keras.layers.Dropout(0.3),

keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),

keras.layers.MaxPooling2D(pool_size=2),

keras.layers.Dropout(0.3),

keras.layers.Flatten(),

keras.layers.Dense(128, activation='relu'),

keras.layers.Dropout(0.5),

keras.layers.Dense(10, activation='softmax')

])

# Compile the model

model.compile(loss=keras.losses.categorical_crossentropy,

optimizer=keras.optimizers.Adam(),

metrics=['accuracy'])

return model

训练模型

然后我们使用 model.fit()来训练模型。

model.fit(x_train,

y_train,

batch_size=64,

epochs=3,

validation_data=(x_test, y_test))

2.模型保存和转换

训练结束后,我们将保存一个 Keras 模型并将其转换为 TFLite 格式。

保存一个 Keras 模型

下面是保存 Keras 模型的方法-

# Save tf.keras model in HDF5 format

keras_model = "mnist_keras_model.h5"

keras.models.save_model(model, keras_model)

将keras模型转换为tflite

当使用 TFLite 转换器将 Keras 模型转换为 TFLite 格式时,有两个选择- 1)从命令行转换,或 2)直接在 python 代码中转换,这个更加推荐。

1)通过命令行转换

$ tflite_convert \

$ --output_file=mymodel.tflite \

$ --keras_model_file=mymodel.h5

2)通过 python 代码转换

如果你可以访问模型训练代码,则这是转换的首选方法。

# Convert the model

flite_model = converter.convert()

# Create the tflite model file

tflite_model_name = "mymodel.tflite"

open(tflite_model_name, "wb").write(tflite_model)

你可以将转换器的训练后量化设置为 true。

# Set quantize to true

converter.post_training_quantize=True

验证转换的模型

将 Keras 模型转换为 TFLite 格式后,验证它是否能够与原始 Keras 模型一样正常运行是很重要的。请参阅下面关于如何使用 TFLite 模型运行推断的 python 代码片段。示例输入是随机输入数据,你需要根据自己的数据更新它。

# Load TFLite model and allocate tensors. interpreter = tf.contrib.lite.Interpreter(model_path="converted_model.tflite")

interpreter.allocate_tensors()

# Get input and output tensors

input_details = interpreter.get_input_details() output_details = interpreter.get_output_details()

# Test model on random input data

input_shape = input_details[0]['shape']

input_data = np.array(np.random.random_sample(input_shape),

dtype=np.float32) interpreter.set_tensor(input_details[0]['index'], input_data)

interpreter.invoke()

output_data = interpreter.get_tensor(output_details[0]['index'])

print(output_data)

ps:确保在转换后和将 TFLite 模型放到 Android 上面之前始终测试它。否则,当它在你的 Android 应用程序上不能工作时,你无法分清是你的 android 代码有问题还是 ML 模型有问题。

3.在 Android 上实现 tflite 模型

现在我们准备在 Android 上实现 TFLite 模型。创建一个新的 Android 项目并遵循以下步骤

将 mnist.tflite 模型放在 assets 文件夹下

更新 build.gradle 以包含 tflite 依赖项

为用户创建自定义视图

创建一个进行数字分类的分类器

从自定义视图输入图像

图像预处理

用模型对图像进行分类

后处理

在用户界面中显示结果

Classifier 类是大多数 ML 魔术发生的地方。确保在类中设置的维度与模型预期的维度匹配:

28x28x1 的图像

10 位数字的 10 个类:0、1、2、3…9

要对图像进行分类,请执行以下步骤:

预处理输入图像。将位图转换为 bytebuffer 并将像素转换为灰度,因为 MNIST 数据集是灰度的。

使用由内存映射到 assets 文件夹下的模型文件创建的解释器运行推断。

后处理输出结果以在 UI 中显示。我们得到的结果有 10 种可能,我们将选择在 UI 中显示概率最高的数字。

过程中的挑战

以下是你可能遇到的挑战:

在 tflite 转换期间,如果出现「tflite 不支持某个操作」的错误,则应请求 tensorflow 团队添加该操作或自己创建自定义运算符。

有时,转换似乎是成功的,但转换后的模型却不起作用:例如,转换后的分类器可能在正负测试中以~0.5 的精度随机分类。(我在 tf 1.10 中遇到了这个错误,后来在 tf1.12 中修复了它)。

如果 Android 应用程序崩溃,请查看 logcat 中的 stacktrace 错误:

确保输入图像大小和颜色通道设置正确,以匹配模型期望的输入张量大小。

确保 in build.gradle aaptoptions 设置为不压缩 tflite 文件。aaptOptions {

noCompress "tflite"

}

总体来说,用 tf.Keras 训练一个简单的图像分类器是轻而易举的,保存 Keras 模型并将其转换为 TFLite 也相当容易。目前,我们在 Android 上实现 TFLite 模型的方法仍然有点单调,希望将来能有所改进。

via:https://medium.com/@margaretmz/e2e-tfkeras-tflite-android-273acde6588

雷锋网雷锋网雷锋网

怎么将tflite部署在安卓上_手把手教程:如何从零开始训练 TF 模型并在安卓系统上运行...相关推荐

  1. tensorrt轻松部署高性能dnn推理_实战教程:TensorRT中递归神经网络的介绍(中文字幕)...

    NVIDIA TensorRT是一个高性能的深度学习推理优化器和运行时,它提供低延迟和高吞吐量.TensorRT可以从每个深度学习框架导入经过训练的模型,从而轻松地创建可以集成到大型应用程序和服务中的 ...

  2. 安卓设备刷linux发行版,绝对精华,大牛教你在Android系统上安装linux发行版

    Install linux distribution (Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on An ...

  3. inno setup 中文乱码问题_解决Inno Setup制作中文安装包在非中文系统上显示乱码的问题...

    尼玛,好几个月没更新了.囧... 目前我司新的客户端开发已经接近尾声,该改的bug已经改完,该重构的地方也都差不多了.视觉效果也已经根据美工的样式改完了.所以,就差制作安装包了.正所谓万事俱备,只欠东 ...

  4. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js

    [Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...

  5. 移植mysql到安卓手机_记录dbnet文本检测转ncnn并移植到安卓上

    目前,文本检测主要分为基于检测网络和分割网络实现,上文(风影:记录densenet-ocr识别网络转ncnn并移植到安卓手机)讲到将yolo3文本检测+densenet识别网络转ncnn推理,并成功移 ...

  6. ios安卓模拟器_软件 | iOS影视神器!Android虚拟大师APP,手机上运行安卓模拟器,还自带ROOT!...

    工具名称:高清电视大全.虚拟大师(文末获取下载方式,直接下载安装) 文章来源:白问黑科技 大家好,我是小白.今天给小伙伴们分享两个APP,一个iOS的,另一个Android的. ▎高清电视大全 iOS ...

  7. 从零开始发布前端代码到服务器上_无服务器计算:让每行代码都能住上“经济适用房”...

    是时候展现真正的实力了!大胆报名吧!! 摘 要 独立的简单函数可以让开发工作变得更加容易,同时由事件驱动的执行可让操作变得更加便宜. 开发人员往往需要花费大量的时间编写代码以解决业务问题.随后,运营团 ...

  8. 如何root安卓手机_你的手机你做主!免 ROOT 卸载安卓手机预装APP

    蛮多安卓手机会在系统内预装一堆 "乱七八糟的" APP,一些APP大多用户都不会用到.这些预装的APP有些会长期在后台运行,不断的消耗你的运存.消耗电量,最难受的是这些预装APP, ...

  9. automotive 安卓开发_谷歌首次提及「Android Automotive」,是安卓车机系统亮相前奏?...

    谷歌近日放出了Android 6.0 Marshmallow版本的兼容性测试纲要(ACDD,Android Compatibility Definition Document),如果细细阅读,你会意外 ...

最新文章

  1. Learn Java - Chapter 1 变量(Variables)-数组(Arrays)
  2. IIS不支持apk文件下载问题
  3. Android app 应用签名
  4. hdu 5616 Jam's balance(dp 正反01背包)
  5. Unity MVC框架 StrangeIoC
  6. C语言霍夫曼编码压缩,数据结构大作业——哈夫曼编码压缩BMP格式文件
  7. C#相等性 - 三个方法和一个接口
  8. 高通增加Adsp log( 三十)
  9. pyqt5 显示更新进度条_python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能...
  10. Linux虚拟文件系统之文件读取(sys_read())
  11. matlab机器学习预测股价+python爬虫
  12. 怎么把cad做的图分享给别人_CAD命令大全分享,作图快人两步
  13. 自动关闭QQ迷你首页的小程序(加上自己的一些理解)
  14. 史上最全面试题汇总,没有之一,不接受反驳
  15. eclipse 汉化教程(中文语言包的下载和安装)
  16. 关于串联匹配电阻其作用
  17. firnbsp;提交的版本的iphone4amp;nbs…
  18. Guava 常用 API
  19. DW大学生网页作业制作设计 中华饮食文化(HTML+CSS+JavaScript) Web前端大作业
  20. Discuz! X2.5数据库字典【转载】

热门文章

  1. Linux笔试题及答案
  2. pytorch: Parameter 的数据结构
  3. 对称加密算法在C#中的踩坑日常
  4. 2018-04-26java实习面试记录
  5. eclipse新建maven项目和聚合项目
  6. CodeForces 617 E. XOR and Favorite Number
  7. play 1.2.4的action执行前后的加载逻辑
  8. flash事件冒泡的理解
  9. 一个网友提供的SCI 投稿全过程信件模板一览
  10. ASP中如何在退出一个页面时自动清空session变量