【问题标题】:How to optimize for inference a simple, saved TensorFlow 1.0.1 graph?如何优化一个简单的、保存的 TensorFlow 1.0.1 图的推理?
【发布时间】:2018-01-05 01:54:45
【问题描述】:

我无法在保存的简单 TensorFlow 图(Python 2.7;pip install tensorflow-gpu==1.0.1 安装的软件包)上成功运行 optimize_for_inference 模块。

背景

保存 TensorFlow Graph

这是我的 Python 脚本,用于生成并保存一个简单的图形,以将 5 添加到我的输入 x placeholder 操作。

import tensorflow as tf

# make and save a simple graph
G = tf.Graph()
with G.as_default():
    x = tf.placeholder(dtype=tf.float32, shape=(), name="x")
    a = tf.Variable(5.0, name="a")
    y = tf.add(a, x, name="y")
    saver = tf.train.Saver()

with tf.Session(graph=G) as sess:
    sess.run(tf.global_variables_initializer())
    out = sess.run(fetches=[y], feed_dict={x: 1.0})
    print(out)
    saver.save(sess=sess, save_path="test_model")

恢复 TensorFlow Graph

我有一个简单的恢复脚本,它可以重新创建保存的图形并恢复图形参数。两个保存/恢复脚本产生相同的输出。

import tensorflow as tf

# Restore simple graph and test model output
G = tf.Graph()

with tf.Session(graph=G) as sess:
    # recreate saved graph (structure)
    saver = tf.train.import_meta_graph('./test_model.meta')
    # restore net params
    saver.restore(sess, tf.train.latest_checkpoint('./'))

    x = G.get_operation_by_name("x").outputs[0]
    y = G.get_operation_by_name("y").outputs
    out = sess.run(fetches=[y], feed_dict={x: 1.0})
    print(out[0])

优化尝试

但是,虽然我对优化的期望不高,但当我尝试优化图以进行推理时,我收到以下错误消息。预期的输出节点似乎不在保存的图表中。

$ python -m tensorflow.python.tools.optimize_for_inference --input test_model.data-00000-of-00001 --output opt_model --input_names=x --output_names=y  
Traceback (most recent call last):  
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main  
    "__main__", fname, loader, pkg_name)  
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code  
    exec code in run_globals  
  File "/{path}/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference.py", line 141, in <module>  
    app.run(main=main, argv=[sys.argv[0]] + unparsed)  
  File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/platform/app.py", line 44, in run  
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File "/{path}/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference.py", line 90, in main  
    FLAGS.output_names.split(","), FLAGS.placeholder_type_enum)  
  File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/tools/optimize_for_inference_lib.py", line 91, in optimize_for_inference  
    placeholder_type_enum)  
  File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/tools/strip_unused_lib.py", line 71, in strip_unused  
    output_node_names)  
  File "/{path}/local/lib/python2.7/site-packages/tensorflow/python/framework/graph_util_impl.py", line 141, in extract_sub_graph  
    assert d in name_to_node_map, "%s is not in graph" % d  
AssertionError: y is not in graph  

进一步调查使我检查了已保存图形的检查点,它仅显示 1 个张量(a,没有 x,也没有 y)。

(tf-1.0.1) $ python -m tensorflow.python.tools.inspect_checkpoint --file_name ./test_model --all_tensors
tensor_name:  a
5.0

具体问题

  1. 为什么我在检查点看不到xy?是因为它们是运算而不是张量吗?
  2. 由于我需要为optimize_for_inference 模块提供输入和输出名称,如何构建图形以便引用输入和输出节点?

【问题讨论】:

    标签: python python-2.7 tensorflow tensorflow-gpu


    【解决方案1】:

    以下是关于如何优化推理的详细指南:

    optimize_for_inference 模块将frozen binary GraphDef 文件作为输入并输出optimized Graph Def 文件,您可以将其用于推理。要获得frozen binary GraphDef file,您需要使用模块freeze_graph,它采用GraphDef protoSaverDef proto 和一组存储在检查点文件中的变量。实现的步骤如下:

    1。保存张量流图

     # make and save a simple graph
     G = tf.Graph()
     with G.as_default():
       x = tf.placeholder(dtype=tf.float32, shape=(), name="x")
       a = tf.Variable(5.0, name="a")
       y = tf.add(a, x, name="y")
       saver = tf.train.Saver()
    
    with tf.Session(graph=G) as sess:
       sess.run(tf.global_variables_initializer())
       out = sess.run(fetches=[y], feed_dict={x: 1.0})
    
      # Save GraphDef
      tf.train.write_graph(sess.graph_def,'.','graph.pb')
      # Save checkpoint
      saver.save(sess=sess, save_path="test_model")
    

    2。冻结图表

    python -m tensorflow.python.tools.freeze_graph --input_graph graph.pb --input_checkpoint test_model --output_graph graph_frozen.pb --output_node_names=y
    

    3。优化推理

    python -m tensorflow.python.tools.optimize_for_inference --input graph_frozen.pb --output graph_optimized.pb --input_names=x --output_names=y
    

    4。使用优化图

    with tf.gfile.GFile('graph_optimized.pb', 'rb') as f:
       graph_def_optimized = tf.GraphDef()
       graph_def_optimized.ParseFromString(f.read())
    
    G = tf.Graph()
    
    with tf.Session(graph=G) as sess:
        y, = tf.import_graph_def(graph_def_optimized, return_elements=['y:0'])
        print('Operations in Optimized Graph:')
        print([op.name for op in G.get_operations()])
        x = G.get_tensor_by_name('import/x:0')
        out = sess.run(y, feed_dict={x: 1.0})
        print(out)
    
    #Output
    #Operations in Optimized Graph:
    #['import/x', 'import/a', 'import/y']
    #6.0
    

    5。对于多个输出名称

    如果有多个输出节点,则指定:output_node_names = 'boxes, scores, classes'并导入graph by,

     boxes,scores,classes, = tf.import_graph_def(graph_def_optimized, return_elements=['boxes:0', 'scores:0', 'classes:0'])
    

    【讨论】:

    • 这是一个非常有帮助、建设性和详细的答案。谢谢!
    • 优秀的答案!您的 cmets 非常宝贵,因为我没有意识到您必须分别保存图形和检查点。顺便说一句,我确实必须将 --input_checkpoint test_model 更改为 --input_checkpoint ./test_model 才能让 freeze_graph 工作。
    • @vijaym 如何指定我是否有多个输出 -- --output_names='cat','shape' 这不起作用。
    • 为什么需要调用global_variables_initializer.run 来获取冻结图?
    • @user1050619 指定多个输出:--output_names='cat,shape'。注意逗号后面没有空格
    【解决方案2】:
    1. 你做错了:inputscript 的 graphdef 文件,而不是检查点的数据部分。您需要将模型冻结到 .pb 文件/ 或获取图形的 prototxt 并使用优化推理脚本。

    This script takes either a frozen binary GraphDef file (where the weight variables have been converted into constants by the freeze_graph script), or a text GraphDef proto file (the weight variables are stored in a separate checkpoint file), and outputs a new GraphDef with the optimizations applied.

    1. 使用write_graph获取图形原型文件
    2. 获取冻结模型freeze graph

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2021-04-19
      • 2023-03-25
      相关资源
      最近更新 更多