连接两个不同图张量流的输入和输出张量
connect input and output tensors of two different graphs tensorflow
我有 2 ProtoBuf 文件,我目前通过调用 -
分别加载和转发每个文件
out1=session.run(graph1out, feed_dict={graph1inp:inp1})
其次是
final=session.run(graph2out, feed_dict={graph2inp:out1})
其中 graph1inp 和 graph1out 是图 1 的输入节点和输出节点以及 图 2
的类似术语
现在,我想连接 graph1out 和 graph2inp 这样我只需要 运行 graph2out 喂 graph1inp 与 inp1。换句话说,以一种 运行 足以 运行 对两个经过训练的 ProtoBuf 文件进行推理的方式连接 2 个相关图的输入和输出张量。
假设您的 Protobuf 文件包含序列化 tf.GraphDef
protos, you can use the input_map
argument of tf.import_graph_def()
以连接两个图:
# Import graph1.
graph1_def = ... # tf.GraphDef object
out1_name = "..." # name of the graph1out tensor in graph1_def.
graph1out, = tf.import_graph_def(graph1_def, return_elements=[out_name])
# Import graph2 and connect it to graph1.
graph2_def = ... # tf.GraphDef object
inp2_name = "..." # name of the graph2inp tensor in graph2_def.
out2_name = "..." # name of the graph2out tensor in graph2_def.
graph2out, = tf.import_graph_def(graph2_def, input_map={inp2_name: graph1out},
return_elements=[out2_name])
接受的答案确实连接了两个图,但是它没有恢复集合、全局变量和可训练变量。经过详尽的搜索,我找到了一个更好的解决方案:
import tensorflow as tf
from tensorflow.python.framework import meta_graph
with tf.Graph().as_default() as graph1:
input = tf.placeholder(tf.float32, (None, 20), name='input')
output = tf.identity(input, name='output')
with tf.Graph().as_default() as graph2:
input = tf.placeholder(tf.float32, (None, 20), name='input')
output = tf.identity(input, name='output')
graph = tf.get_default_graph()
x = tf.placeholder(tf.float32, (None, 20), name='input')
我们使用 tf.train.export_meta_graph
导出也 CollectionDef 和 meta_graph.import_scoped_meta_graph
导入它。这是连接发生的地方,特别是在 input_map
参数中。
meta_graph1 = tf.train.export_meta_graph(graph=graph1)
meta_graph.import_scoped_meta_graph(meta_graph1, input_map={'input': x}, import_scope='graph1')
out1 = graph.get_tensor_by_name('graph1/output:0')
meta_graph2 = tf.train.export_meta_graph(graph=graph2)
meta_graph.import_scoped_meta_graph(meta_graph2, input_map={'input': out1}, import_scope='graph2')
现在图形已连接,全局变量正在 re-mapped。
print(tf.global_variables())
您还可以直接从文件中导入元图。
我有 2 ProtoBuf 文件,我目前通过调用 -
分别加载和转发每个文件out1=session.run(graph1out, feed_dict={graph1inp:inp1})
其次是
final=session.run(graph2out, feed_dict={graph2inp:out1})
其中 graph1inp 和 graph1out 是图 1 的输入节点和输出节点以及 图 2
的类似术语现在,我想连接 graph1out 和 graph2inp 这样我只需要 运行 graph2out 喂 graph1inp 与 inp1。换句话说,以一种 运行 足以 运行 对两个经过训练的 ProtoBuf 文件进行推理的方式连接 2 个相关图的输入和输出张量。
假设您的 Protobuf 文件包含序列化 tf.GraphDef
protos, you can use the input_map
argument of tf.import_graph_def()
以连接两个图:
# Import graph1.
graph1_def = ... # tf.GraphDef object
out1_name = "..." # name of the graph1out tensor in graph1_def.
graph1out, = tf.import_graph_def(graph1_def, return_elements=[out_name])
# Import graph2 and connect it to graph1.
graph2_def = ... # tf.GraphDef object
inp2_name = "..." # name of the graph2inp tensor in graph2_def.
out2_name = "..." # name of the graph2out tensor in graph2_def.
graph2out, = tf.import_graph_def(graph2_def, input_map={inp2_name: graph1out},
return_elements=[out2_name])
接受的答案确实连接了两个图,但是它没有恢复集合、全局变量和可训练变量。经过详尽的搜索,我找到了一个更好的解决方案:
import tensorflow as tf
from tensorflow.python.framework import meta_graph
with tf.Graph().as_default() as graph1:
input = tf.placeholder(tf.float32, (None, 20), name='input')
output = tf.identity(input, name='output')
with tf.Graph().as_default() as graph2:
input = tf.placeholder(tf.float32, (None, 20), name='input')
output = tf.identity(input, name='output')
graph = tf.get_default_graph()
x = tf.placeholder(tf.float32, (None, 20), name='input')
我们使用 tf.train.export_meta_graph
导出也 CollectionDef 和 meta_graph.import_scoped_meta_graph
导入它。这是连接发生的地方,特别是在 input_map
参数中。
meta_graph1 = tf.train.export_meta_graph(graph=graph1)
meta_graph.import_scoped_meta_graph(meta_graph1, input_map={'input': x}, import_scope='graph1')
out1 = graph.get_tensor_by_name('graph1/output:0')
meta_graph2 = tf.train.export_meta_graph(graph=graph2)
meta_graph.import_scoped_meta_graph(meta_graph2, input_map={'input': out1}, import_scope='graph2')
现在图形已连接,全局变量正在 re-mapped。
print(tf.global_variables())
您还可以直接从文件中导入元图。