Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

TensorFlowのFreeze Graph ツール


TensorFlow LiteとAndroid Neural Network APIに出てきたけど、
TensorFlowモデルを TensorFlow Lite Converter 経由で TensorFLow Lite Model File (.tflite)で、

TensorFlowモデルをTensorFlow Lite Converter にかける前に、次のステップが必要ですよ。

 ・freeze_graph
 ・graph_transform.py

freeze_grapg.pyは、モデルと学習済みのパラメータ(CheckPoint)からモデル内の変数をすべて定数にするというもの。

TensorFlow Liteの説明でのFreeze Graphのところ
引用
    bazel build tensorflow/python/tools:freeze_graph

    bazel-bin/tensorflow/python/tools/freeze_graph\
        --input_graph=/tmp/mobilenet_v1_224.pb \
        --input_checkpoint=/tmp/checkpoints/mobilenet-10202.ckpt \
        --input_binary=true --output_graph=/tmp/frozen_mobilenet_v1_224.pb \
        --output_node_names=MobileNet/Predictions/Reshape_1

freeze_graphコマンドは、bazelコマンドで生成する必要があります。

    --input_graphパラメータにて、モデルファイル(.pb : GragDef)
    --input_checkpointパラメータにて、モデルを学習した時に、CheckPointファイル (.ckpt)
    --input_binaryパラメータにて、モデルファイルがバイナリかテキストかを指定、.pbファイルだからバイナリ
    --output_graphパラメータにて、生成するモデルファイル名 (.pb)
    --output_node_namesパラメータにて、出力ノード名をしてい

mobilenet_v1_224.pb * modelnet-10202.chpt から frozen_mobilenet_v1_224.pb が生成されます。

モデルの出力ノードが分からないときは、Graph Transforms Toolのsummarize_graphを使うことで、Graphの中を知ることができます。
引用
    bazel build tensorflow/tools/graph_transforms:summarize_graph

    bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=tensorflow_inception_graph.pb

summarize_graphコマンド も freeze_graphコマンドと同様に、bazelにて生成する必要があります。

summarize_graphコマンドは、--in_graphパラメータでモデルのファイル名を指定します。

ここの例を引用します。
引用
    $ bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=/tmp/frozen_inception_v1.pb
    Found 1 possible inputs: (name=input, type=float(1), shape=[1,224,224,3])   
    No variables spotted.
    Found 1 possible outputs: (name=InceptionV1/Logits/Predictions/Reshape_1, op=Reshape)
    Found 6633279 (6.63M) const parameters, 0 (0) variable parameters, and 0 control_edges
    Op types used: 298 Const, 231 Identity, 114 Add, 114 Mul, 58 Conv2D, 57 Relu, 57 Rsqrt, 57 Sub, 13 MaxPool, 9 ConcatV2, 2 Reshape, 1 AvgPool, 1 BiasAdd, 1 Placeholder, 1 Softmax, 1 Squeeze
    To use with tensorflow/tools/benchmark:benchmark_model try these arguments:
    bazel run tensorflow/tools/benchmark:benchmark_model -- --graph=/tmp/Xfrozen_inception_v1.pb --show_flops --input_layer=input --input_layer_type=float --input_layer_shape=1,224,224,3 --output_layer=InceptionV1/Logits/Predictions/Reshape_1

   Found 1 possible outputs: (name=InceptionV1/Logits/Predictions/Reshape_1, op=Reshape) ===

   の InceptionV1/Logits/Predictions/Reshape_1 が出力ノードになります。