Tensorflow Lite tflite模型的生成与导入 - python

假如想要在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()加上。

这样在PC端的Python中可以看出导出的tflite模型可用,那我们下一步就开始在ARM板子上试了。就下一篇文章再说吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容