Tensorflow Конвертировать файл pb в TFLITE, используя python - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в работе над Tensorflow.У меня есть модель, сохраненная после тренировки в виде файла pb, я хочу использовать tenorflow mobile, и важно работать с файлом TFLITE.Проблема в том, что большинство примеров, которые я нашел после поиска в Google для конвертеров, - это команда на терминале или cmd.Не могли бы вы поделиться примером преобразования файлов в tflite с использованием кода Python?

Спасибо

Ответы [ 4 ]

0 голосов
/ 27 января 2019

Вот что у меня сработало: ( SSD_InceptionV2 модель )

  1. После окончания тренировки.я использовал model_main.py из папки object_detection.TFv1.11
  2. ExportGraph as TFLITE:
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
Это создает файл .pb, так что вы можете сгенерировать из него файл tflite следующим образом:
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

Теперь входы / выходы я не уверен на 100чтобы получить это, но этот код помогает мне раньше:

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')]
0 голосов
/ 08 ноября 2018
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 - списки имен входов и выходов соответственно.

0 голосов
/ 27 ноября 2018

Следуя этому примеру TF , вы можете передать параметр "--Saved_model_dir", чтобы экспортировать папку сохраненных_моделей.pb и переменных в какой-либо каталог (не существующий каталог) перед запуском сценария retrain.py:

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:

из тензорного потока.contrib.lite.python import convert_saved_model

ПомнитеВы можете конвертировать в tflite двумя способами:

enter image description here

Но самый простой способ - экспортировать сохраненный_модель.pb спеременные, если вы хотите избежать использования инструментов сборки, таких как Bazel.

0 голосов
/ 01 июня 2018

Вы можете конвертировать в tflite напрямую в python.Вы должны заморозить график и использовать toco_convert .Ему нужны имена и формы ввода и вывода перед вызовом API, как в случае командной строки.

Пример фрагмента кода

Скопирован из документации , где "замороженный" (без переменных) граф определен как часть вашего кода:

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 будет жаловаться!

Если вы заморозили graphdef и знаете входные и выходные данные

Тогда вы не сможетене нужна сессияВы можете напрямую вызвать 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)

Если у вас есть не замороженный graphdef и вы знаете входы и выходы

Затем вы должны загрузить сессию и сначала заморозить график перед вызовом 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.Смотрите мой ответ на этот ТАК вопрос .

...