Tensor flow Camera Demoの分類にカスタムモデルを使用します。 .bpファイルを生成し、そこに含まれる巨大なグラフを表示できました。 [ https://www.oreilly.com/learning/tensorflow-on-Android] に示されているように、このグラフを最適化されたグラフに変換するには、次の手順を使用できます。
$ bazel-bin/tensorflow/python/tools/optimize_for_inference \
--input=tf_files/retrained_graph.pb \
--output=tensorflow/examples/Android/assets/retrained_graph.pb
--input_names=Mul \
--output_names=final_result
ここで、グラフ表示からinput_namesおよびoutput_namesを見つける方法。適切な名前を使用しないと、デバイスがクラッシュします。
E/TensorFlowInferenceInterface(16821): Failed to run TensorFlow inference
with inputs:[AvgPool], outputs:[predictions]
E/AndroidRuntime(16821): FATAL EXCEPTION: inference
E/AndroidRuntime(16821): Java.lang.IllegalArgumentException: Incompatible
shapes: [1,224,224,3] vs. [32,1,1,2048]
E/AndroidRuntime(16821): [[Node: dropout/dropout/mul = Mul[T=DT_FLOAT,
_device="/job:localhost/replica:0/task:0/cpu:0"](dropout/dropout/div,
dropout/dropout/Floor)]]
これを試して:
pythonを実行
>>> import tensorflow as tf
>>> gf = tf.GraphDef()
>>> gf.ParseFromString(open('/your/path/to/graphname.pb','rb').read())
その後
>>> [n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]
その後、次のような結果を取得できます。
['Mul=>Placeholder', 'final_result=>Softmax']
しかし、エラーメッセージに関するノード名の問題かどうかはわかりません。グラフファイルをロードするときに間違った引数を指定したか、生成されたグラフファイルが間違っていると思いますか?
この部分を確認してください:
E/AndroidRuntime(16821): Java.lang.IllegalArgumentException: Incompatible
shapes: [1,224,224,3] vs. [32,1,1,2048]
UPDATE:申し訳ありませんが、(再)トレーニングされたグラフを使用している場合は、これを試してください:
[n.name + '=>' + n.op for n in gf.node if n.op in ( 'Softmax','Mul')]
(再)トレーニングされたグラフは、入力/出力op名を「Mul」および「Softmax」として保存し、最適化および/または量子化されたグラフは「Placeholder」および「Softmax」として保存するようです。
BTW、モバイル環境で再トレーニングされたグラフを使用することは、Peter Wardenの投稿によると推奨されません: https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets / 。パフォーマンスとファイルサイズの問題のために、量子化されたグラフまたはメマップグラフを使用する方が良いでしょう。Androidしかし... :( Androidの量子化グラフ)
最近、私はこのオプションをテンソルフローから直接見つけました:
bazel build tensorflow/tools/graph_transforms:summarize_graph
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph
--in_graph=custom_graph_name.pb