我是Tensorflow的新成员。 我将训练后的模型保存为pb文件,我想使用tensorflow mobile,使用TFLITE文件很重要。 问题是我在googling for converter后发现的大部分例子都是终端或cmd上的命令。 你能否分享一下使用python代码转换为tflite文件的例子?
由于
答案 0 :(得分:5)
您可以直接在python中直接转换为tflite。您必须freeze the graph并使用toco_convert。它需要在调用API之前确定输入和输出名称和形状,就像在命令行情况下一样。
从documentation复制,其中“冻结”(无变量)图表被定义为代码的一部分:
import tensorflow as tf
img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
val = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
out = tf.identity(val, name="out")
with tf.Session() as sess:
tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
open("test.tflite", "wb").write(tflite_model)
在上面的示例中,没有冻结图步骤,因为没有变量。如果你有变量并运行toco而没有冻结图形,即首先将这些变量转换为常量,那么toco会抱怨!
然后你不需要会话。您可以直接调用toco API:
path_to_frozen_graphdef_pb = '...'
input_tensors = [...]
output_tensors = [...]
frozen_graph_def = tf.GraphDef()
with open(path_to_frozen_graphdef_pb, 'rb') as f:
frozen_graph_def.ParseFromString(f.read())
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)
然后你必须先加载会话并冻结图表,然后再调用toco:
path_to_graphdef_pb = '...'
g = tf.GraphDef()
with open(path_to_graphdef_pb, 'rb') as f:
g.ParseFromString(f.read())
output_node_names = ["..."]
input_tensors = [..]
output_tensors = [...]
with tf.Session(graph=g) as sess:
frozen_graph_def = tf.graph_util.convert_variables_to_constants(
sess, sess.graph_def, output_node_names)
# Note here we are passing frozen_graph_def obtained in the previous step to toco.
tflite_model = tf.contrib.lite.toco_convert(frozen_graph_def, input_tensors, output_tensors)
如果您没有定义图表,可能会发生这种情况,例如。您从某个地方下载了图表,或者使用了一个高级API,比如隐藏图表的tf.estimators。在这种情况下,您需要加载图形并在调用toco之前查找输入和输出。请参阅我对this SO question的回答。
答案 1 :(得分:1)
这对我有用:( SSD_InceptionV2模型)
python /tensorflow/models/research/object_detection/export_tflite_ssd_graph.py --pipeline_config_path annotations/ssd_inception_v2_coco.config --trained_checkpoint_prefix trained-inference-graphs/inference_graph_v7.pb/model.ckpt --output_directory trained-inference-graphs/inference_graph_v7.pb/tflite --max_detections 3
tflite_convert --output_file=test.tflite --graph_def_file=tflite_graph.pb --input_arrays=normalized_input_image_tensor --output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' --input_shape=1,300,300,3 --allow_custom_ops
现在输入/输出我不确定如何获得此输入,但是此代码之前对我有帮助:
import tensorflow as tf
frozen='/tensorflow/mobilenets/mobilenet_v1_1.0_224.pb'
gf = tf.GraphDef()
gf.ParseFromString(open(frozen,'rb').read())
[n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]
[n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Mul')]
答案 2 :(得分:0)
converter = tf.contrib.lite.TFLiteConverter.from_frozen_graph(
frozen_model_filename, INPUT_NODE, OUTPUT_NODE)
tflite_model = converter.convert()
open(TFLITE_OUTPUT_FILE, "wb").write(tflite_model)
INPUT_NODE和OUTPUT_NODE分别是输入和输出名称的列表。
答案 3 :(得分:0)
遵循此TF example,可以在运行retrain.py脚本之前传递“ --Saved_model_dir”参数以将save_model.pb和变量文件夹导出到某个目录(无现有dir):
python retrain.py ...... --saved_model_dir / home /..../ export
要将模型转换为tflite,您需要使用以下行:
convert_saved_model.convert(saved_model_dir='/home/.../export',output_arrays="final_result",output_tflite='/home/.../export/graph.tflite')
注意:您需要导入convert_saved_model:
从tensorflow.contrib.lite.python导入convert_saved_model
请记住,您可以通过两种方式转换为tflite:
但是,最简单的方法是使用变量导出Saved_model.pb,以防您避免使用Bazel等构建工具。