You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TensorFlow中单个input Placeholder同时供给两个不同Scope的DNN?

解决TensorFlow中单个输入同时喂入多Scope下Placeholder的问题

先明确你的核心限制:不能修改生产服务器代码,不能修改DNN类,只能通过构建新图让生产端的input同时给两个DNN的专属Placeholder喂数据。下面给你两种可行的方案,按需选择:

方案一:赋值操作传递数据(简单易实现)

这种方法不需要修改图结构,而是通过添加赋值操作,把生产端传入的input值同步给两个DNN的输入Placeholder。

实现步骤:

  1. 先创建符合生产要求的全局input Placeholder:
import tensorflow as tf

# 严格匹配生产要求的名称和形状
global_input = tf.placeholder(tf.float32, shape=(50), name='input')
  1. 实例化两个Scope下的DNN网络:
dnn1 = DNN(scope='dnn1')
dnn2 = DNN(scope='dnn2')
  1. 通过节点名称获取两个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')
  1. 添加赋值操作,将全局input的值传递给两个DNN的输入:
# 创建赋值操作,确保全局输入的值覆盖DNN的专属输入
assign_dnn1 = tf.assign(dnn1_input, global_input)
assign_dnn2 = tf.assign(dnn2_input, global_input)
  1. 运行时的注意事项:
    在执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:03:06