如何让TensorFlow中单个input Placeholder同时供给两个不同Scope的DNN?
解决TensorFlow中单个输入同时喂入多Scope下Placeholder的问题
先明确你的核心限制:不能修改生产服务器代码,不能修改DNN类,只能通过构建新图让生产端的input同时给两个DNN的专属Placeholder喂数据。下面给你两种可行的方案,按需选择:
方案一:赋值操作传递数据(简单易实现)
这种方法不需要修改图结构,而是通过添加赋值操作,把生产端传入的input值同步给两个DNN的输入Placeholder。
实现步骤:
- 先创建符合生产要求的全局
inputPlaceholder:
import tensorflow as tf # 严格匹配生产要求的名称和形状 global_input = tf.placeholder(tf.float32, shape=(50), name='input')
- 实例化两个Scope下的DNN网络:
dnn1 = DNN(scope='dnn1') dnn2 = DNN(scope='dnn2')
- 通过节点名称获取两个DNN的专属输入Placeholder:
dnn1_input = tf.get_default_graph().get_tensor_by_name('dnn1/input:0') dnn2_input = tf.get_default_graph().get_tensor_by_name('dnn2/input:0')
- 添加赋值操作,将全局
input的值传递给两个DNN的输入:
# 创建赋值操作,确保全局输入的值覆盖DNN的专属输入 assign_dnn1 = tf.assign(dnn1_input, global_input) assign_dnn2 = tf.assign(dnn2_input, global_input)
- 运行时的注意事项:
在执行DNN的计算节点前,必须先运行这两个赋值操作。如果是导出图给C生产端使用,需要把赋值操作和DNN的输出节点一起保存,确保C端按顺序执行。
示例运行代码(Python端验证用):
with tf.Session() as sess: # 模拟生产端传入的数据 test_data = tf.random_normal(shape=(50)).eval() # 先执行赋值,同步数据 sess.run([assign_dnn1, assign_dnn2], feed_dict={'input:0': test_data}) # 再获取两个DNN的输出(假设DNN类有output属性) output1, output2 = sess.run([dnn1.output, dnn2.output])
方案二:图结构编辑(更适合生产环境)
如果希望彻底让DNN直接使用全局input,不需要额外的赋值步骤,可以用TensorFlow的图编辑工具修改图结构,把两个DNN的输入边直接连接到全局input上。
实现步骤:
import tensorflow as tf import tensorflow.contrib.graph_editor as ge # 创建全局input Placeholder global_input = tf.placeholder(tf.float32, shape=(50), name='input') # 实例化DNN网络 dnn1 = DNN(scope='dnn1') dnn2 = DNN(scope='dnn2') # 获取两个DNN的专属输入节点 dnn1_input = tf.get_default_graph().get_tensor_by_name('dnn1/input:0') dnn2_input = tf.get_default_graph().get_tensor_by_name('dnn2/input:0') # 找到每个DNN输入节点的所有输出边(即连接到DNN内部的边) dnn1_edges = ge.get_out_edges(dnn1_input.op) dnn2_edges = ge.get_out_edges(dnn2_input.op) # 将这些边的源替换为全局input,让DNN内部节点直接使用全局输入 for edge in dnn1_edges: ge.reroute_ts(global_input, dnn1_input, edge=edge) for edge in dnn2_edges: ge.reroute_ts(global_input, dnn2_input, edge=edge) # 可选:删除原来的两个DNN输入节点(不删除也不影响,因为已经没有边依赖它们了) ge.remove(dnn1_input.op) ge.remove(dnn2_input.op)
方案优势:
修改后的图中,两个DNN的计算逻辑直接依赖全局input,运行时不需要额外执行赋值操作,和生产服务器的feed_dict逻辑完全匹配,更适合稳定的生产环境。
注意事项
- 无论用哪种方案,最终导出的图必须包含全局
input节点,以及DNN的输出节点(或必要的计算节点)。 - 如果是导出SavedModel给C++端加载,要确保保存的签名中指定
input为输入张量。
内容的提问来源于stack exchange,提问作者skjerns
相关产品推荐
相关产品推荐

