Tensorflow Lite tflite模型的生成与导入

假如想要在ARM板上用tensorflow lite,那么意味着必须要把PC上的模型生成tflite文件,然后在ARM上导入这个tflite文件,通过解析这个文件来进行计算。
根据前面所说,tensorflow的所有计算都会在内部生成一个图,包括变量的初始化,输入定义等,那么即便不是经过训练的神经网络模型,只是简单的三角函数计算,也可以生成一个tflite模型用于在tensorflow lite上导入。所以,这里我就只做了简单的sin()计算来跑一编这个流程。

生成tflite模型

这部分主要是调用TFLiteConverter函数,直接生成tflite文件,不再通过pb文件转化。
先上代码:

import numpy as np
import time
import math
import tensorflow as tf

SIZE = 1000
X = np.random.rand(SIZE, 1)
X = X*(math.pi/2.0)

start = time.time()
x1 = tf.placeholder(tf.float32, [SIZE, 1], name=‘x1-input‘)
x2 = tf.placeholder(tf.float32, [SIZE, 1], name=‘x2-input‘)
y1 = tf.sin(x1)
y2 = tf.sin(x2)
y = y1*y2

with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    converter = tf.lite.TFLiteConverter.from_session(sess, [x1, x2], [y])
    tflite_model = converter.convert()
    open("/home/alcht0/share/project/tensorflow-v1.12.0/converted_model.tflite", "wb").write(tflite_model)

end = time.time()
print("2nd ", str(end - start))

转化函数
主要遇到的问题是tensorflow的变化实在太快,这些个转化函数一直在变。位置也一直在变,现在参考官方文档,是按上面代码中调用,否则就会报找不到lite之类的错误。我现在PC上的tensorflow Python版本是1.13,所以lite已经在contrib外面了,如果是以前的版本,要按文档中下面这样调用。

TensorFlow Version Python API
1.12 tf.contrib.lite.TFLiteConverter
1.9-1.11 tf.contrib.lite.TocoConverter
1.7-1.8 tf.contrib.lite.toco_convert

输入参数shape

本来在本文件中为了给定的输入数据大小自由,x1,x2shape会写成[None, 1],但是如果这样写,转化成tflite模型后会默认为[1,1],并不能自由接收数据大小,所以在这里要指定大小SIZE

x1 = tf.placeholder(tf.float32, [SIZE, 1], name=‘x1-input‘)

导入tflite模型

本来这部分应该是在ARM板子上做的,但是为了验证tflite文件的可用性,我先在PC的Python上试验。先上代码:

import tensorflow as tf
import numpy as np
import math
import time

SIZE = 1000
X = np.random.rand(SIZE, 1, ).astype(np.float32)
X = X*(math.pi/2.0)

start = time.time()

interpreter = tf.lite.Interpreter(model_path="/home/alcht0/share/project/tensorflow-v1.12.0/converted_model.tflite")
interpreter.allocate_tensors()

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

interpreter.set_tensor(input_details[0][‘index‘], X)
interpreter.set_tensor(input_details[1][‘index‘], X)

interpreter.invoke()

output_data = interpreter.get_tensor(output_details[0][‘index‘])
end = time.time()
print("1st ", str(end - start))

首先根据tflite文件生成解析器,然后用allocate_tensors()分配内存。将输入通过set_tensor传入,然后调用invoke()来真正运行。最后得到输出。
Python跑的时候可以很清楚的看到input_details的数据结构。官方的例子是只传入一个数据,所以只需要取input_details[0],而我传入了2个输入,所以需要设置2个。同时可以看到input_details的2个数据的名字都是我在之前设置的x1-inputx2-input,这样非常好理解。

输入参数类型
这里有个坑是输入参数的类型一定要注意。我在生成模型的时候定义的输入参数类型是tf.float32,而在导入的时候如果直接是X = np.random.rand(SIZE, 1, )的话,会报错:

ValueError: Cannot set tensor: Got tensor of type 0 but expected type 1 for input 3

这里把通过astype(np.float32)把输入参数指定为float32就OK了。

  • 操作不支持的坑
    可以从前面的代码里看到我写了两个sin(),其实一开始是一个sin()一个cos()的,但是好像默认的tflite模型不支持cos()操作,无法生成,所以我只好暂时先只写sin(),后面再研究怎么把cos()加上。

原文地址:https://www.cnblogs.com/scarecrow-blog/p/11475139.html

时间: 2024-08-30 16:55:15

Tensorflow Lite tflite模型的生成与导入的相关文章

tflite模型的生成

由于IOS App需要使用已训练的tensorflow模型进行物体检测,特将此过程记录下来已备不时之需. 一.tflite是什么 TensorFlow Lite 的设计旨在在各种设备上高效执行模型.这种高效部分源于在存储模型时,采用了一种特殊的格式.TensorFlow 模型在能被 TensorFlow Lite 使用前,必须转换成这种格式. 由上图可知: tflite是从训练的模型转换而来的: tflite是为了在App设备上使用: 二.从训练结果到tflite 1.ckpt训练模型说明 训练

Tensorflow中保存模型时生成的各种文件区别和作用

假如我们得到了如下的checkpoints, 上面的文件主要可以分成三类:一种是在保存模型时生成的文件,一种是我们在使用tensorboard时生成的文件,还有一种就是plugins这个文件夹,这个是使用capture tpuprofile工具生成的,该工具可以跟踪TPU的计算过程,并对你的模型性能进行分析,这里就不想详细介绍了.本文主要介绍前面两种文件的作用: tensorboard文件 events.out.tfevents.*...: 保存的就是你的accuracy或者loss在不同时刻的

移动端目标识别(3)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之Running on mobile with TensorFlow Lite (写的很乱,回头更新一个简洁的版本)

承接移动端目标识别(2) 使用TensorFlow Lite在移动设备上运行         在本节中,我们将向您展示如何使用TensorFlow Lite获得更小的模型,并允许您利用针对移动设备优化的操作. TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案.它支持端上的机器学习推理,具有低延迟和小二进制模型大小. TensorFlow Lite使用了许多技术,例如允许更小和更快(定点数学)模型的量化内核. 对于本节,您需要从源代码构建TensorFlow

TensorFlow Lite for Android示例

一.TensorFlow  Lite TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案.TensorFlow Lite 支持 Android.iOS 甚至树莓派等多种平台. 二.tflite格式 TensorFlow 生成的模型是无法直接给移动端使用的,需要离线转换成.tflite文件格式. tflite 存储格式是 flatbuffers. FlatBuffers 是由Google开源的一个免费软件库,用于实现序列化格式.它类似于Protocol Buffers.Th

AoE 搭档 TensorFlow Lite ,让终端侧 AI 开发变得更加简单。

AoE( AI on Edge , https://github.com/didi/AoE ) 是滴滴近期开源的终端侧 AI 集成运行时环境 ( IRE ). 随着人工智能技术快速发展,近几年涌现出了许多运行在终端的高性能推理框架,例如 TensorFlow Lite,在实时性.安全性上给开发者带来更多支持和选择,极大的优化了用户的使用体验,但当我们想要在终端侧落地一些具体的 AI 业务时,会发现有些不得不面对的问题: 除了要做推理框架选型,还需要关注数据预 / 后处理逻辑的稳定性,模型分发使用

马尔可夫模型自动生成文章

马尔可夫链是一个随机过程,在这个过程中,我们假设前一个或前几个状态对预测下一个状态起决定性作用.和抛硬币不同,这些事件之间不是相互独立的.通过一个例子更容易理解. 想象一下天气只能是下雨天或者晴天.也就是说,状态空间是雨天或者晴天.我们可以将马尔可夫模型表示为一个转移矩阵,矩阵的每一行代表一个状态,每一列代表该状态转移到另外一个状态的概率. 然而,通过这个状态转移示意图更容易理解. 换句话说,假如今天是晴天,那么有90%的概率明天也是晴天,有10%的概率明天是下雨天. 文章生成器 马尔可夫模型有

WebAPI生成可导入到PostMan的数据

一.前言 现在使用WebAPI来作为实现企业服务化的需求非常常见,不可否认它也是很便于使用的,基于注释可以生成对应的帮助文档(Microsoft.AspNet.WebApi.HelpPage),但是比较便利和可持久化的调试官方却没有相应的集成,虽然我们可以使  用诸如Fiddler.Swagger.PostMan.HttpClient.单元测试等等来调试我们的WebAPI,但是却依然不是很方便,对于公司来说也需要有一种可以统一.可持久化.且行之有效的规范. 调试接口我希望他能达到以下3点: 1:

【转载】判别模型、生成模型与朴素贝叶斯方法

判别模型.生成模型与朴素贝叶斯方法 转载时请注明来源:http://www.cnblogs.com/jerrylead 1判别模型与生成模型 上篇报告中提到的回归模型是判别模型,也就是根据特征值来求结果的概率.形式化表示为,在参数确定的情况下,求解条件概率.通俗的解释为在给定特征后预测结果出现的概率. 比如说要确定一只羊是山羊还是绵羊,用判别模型的方法是先从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率.换一种思路,我们可以根据山羊的特征首先学习出一个山羊

监督学习模型分类 生成模型 判别模型 概率模型 非概率模型 参数模型 非参数模型

判别模型和生成模型:统计学派和贝叶斯学派之争 判别模型: 直接对输入空间到输出空间的映射h(x)做预测,或者直接对条件概率分布P(y|x)做预测 PM,SVM,NN,KNN,LR,DT 模型一般更准确 不需要预设条件 鲁棒性更高 生成模型: 先对概率分布P(x,y)做预测,根据贝叶斯公式得到P(y|x) GDA,NB,HMM 收敛速度一般更快 可以训练包含隐变量的模型 需要假设的先验分布 可以还原出联合概率分布P(x,y) 可以还原出判别模型,但反过来不行 概率模型和非概率模型:预测概率还是预测