Tensorflow: How to convert .meta, .data and .index model files into one graph.pb file

前端 未结 4 1762

In tensorflow the training from the scratch produced following 6 files:

  1. events.out.tfevents.1503494436.06L7-BRM738
  2. model.ckpt-2248
相关标签:
4条回答
  • 2020-11-28 06:38

    You can use this simple script to do that. But you must specify the names of the output nodes.

    import tensorflow as tf
    
    meta_path = 'model.ckpt-22480.meta' # Your .meta file
    output_node_names = ['output:0']    # Output nodes
    
    with tf.Session() as sess:
        # Restore the graph
        saver = tf.train.import_meta_graph(meta_path)
    
        # Load weights
        saver.restore(sess,tf.train.latest_checkpoint('path/of/your/.meta/file'))
    
        # Freeze the graph
        frozen_graph_def = tf.graph_util.convert_variables_to_constants(
            sess,
            sess.graph_def,
            output_node_names)
    
        # Save the frozen graph
        with open('output_graph.pb', 'wb') as f:
          f.write(frozen_graph_def.SerializeToString())
    

    If you don't know the name of the output node or nodes, there are two ways

    1. You can explore the graph and find the name with Netron or with console summarize_graph utility.

    2. You can use all the nodes as output ones as shown below.

    output_node_names = [n.name for n in tf.get_default_graph().as_graph_def().node]
    

    (Note that you have to put this line just before convert_variables_to_constants call.)

    But I think it's unusual situation, because if you don't know the output node, you cannot use the graph actually.

    0 讨论(0)
  • 2020-11-28 06:45

    I tried the freezed_graph.py script, but the output_node_name parameter is totally confusing. Job failed.

    So I tried the other one: export_inference_graph.py. And it worked as expected!

    python -u /tfPath/models/object_detection/export_inference_graph.py \
      --input_type=image_tensor \
      --pipeline_config_path=/your/config/path/ssd_mobilenet_v1_pets.config \
      --trained_checkpoint_prefix=/your/checkpoint/path/model.ckpt-50000 \
      --output_directory=/output/path
    

    The tensorflow installation package I used is from here: https://github.com/tensorflow/models

    0 讨论(0)
  • 2020-11-28 06:45

    First, use the following code to generate the graph.pb file. with tf.Session() as sess:

        # Restore the graph
        _ = tf.train.import_meta_graph(args.input)
    
        # save graph file
        g = sess.graph
        gdef = g.as_graph_def()
        tf.train.write_graph(gdef, ".", args.output, True)
    

    then, use summarize graph get the output node name. Finally, use

    python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "
    

    to generate the freeze graph.

    0 讨论(0)
  • 2020-11-28 06:56

    As it may be helpful for others, I also answer here after the answer on github ;-). I think you can try something like this (with the freeze_graph script in tensorflow/python/tools) :

    python freeze_graph.py --input_graph=/path/to/graph.pbtxt --input_checkpoint=/path/to/model.ckpt-22480 --input_binary=false --output_graph=/path/to/frozen_graph.pb --output_node_names="the nodes that you want to output e.g. InceptionV3/Predictions/Reshape_1 for Inception V3 "
    

    The important flag here is --input_binary=false as the file graph.pbtxt is in text format. I think it corresponds to the required graph.pb which is the equivalent in binary format.

    Concerning the output_node_names, that's really confusing for me as I still have some problems on this part but you can use the summarize_graph script in tensorflow which can take the pb or the pbtxt as an input.

    Regards,

    Steph

    0 讨论(0)
提交回复
热议问题