web-dev-qa-db-ja.com

Tensorflow pythonを使用してpbファイルをTFLITEに変換します

Tensorflowに取り組んでいるのは初めてです。トレーニング後にモデルをpbファイルとして保存しました。tensorflowmobileを使用したいので、TFLITEファイルで作業することが重要です。問題は、コンバーターのグーグル検索後に見つかった例のほとんどが、ターミナルまたはcmdのコマンドです。 pythonコードを使用してtfliteファイルに変換する例を教えてください。

ありがとう

5

これに続いて TFの例 「--Saved_model_dir」パラメーターを渡して、retrain.pyスクリプトを実行する前にsaved_model.pbおよび変数フォルダーをあるディレクトリ(既存のディレクトリはなし)にエクスポートできます。

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からimport convert_saved_model

2つの方法でtfliteに変換できることに注意してください:

enter image description here

しかし、最も簡単な方法は、Bazelのようなビルドツールの使用を避けたい場合に、変数を使用してsaved_model.pbをエクスポートすることです。

1

pythonで直接tfliteに直接変換できます。 グラフをフリーズする を使用し、 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は文句を言います!

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)

グラフの入力/出力がわからない場合

これは、グラフを定義しなかった場合に発生する可能性があります。どこかからグラフをダウンロードしたか、グラフを隠すtf.estimatorsのような高レベルAPIを使用しました。この場合、tocoを呼び出す前に、グラフを読み込んで、入力と出力を把握するために突っ走る必要があります。 this SO question

9
Pannag Sanketi

これは私のために働いたものです:(SSD_InceptionV2モデル

  1. トレーニング終了後。 object_detectionフォルダーのmodel_main.pyを使用しました。 TFv1.11
  2. TFLITEとしてのExportGraph:
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
  1. これにより、.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

今、私はこれを得る方法がわからない入力/出力ですが、このコードは前に役立ちます:

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
Chop Labalagun
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
prateek agrawal