逐步建立 tf.绘制并执行它



我正在尝试根据某些条件逐步构建一个tf.Graph,并在完成追加后运行一次。

代码如下所示:

class Model:
def __init__(self):
self.graph = tf.Graph()
... some code ...
def build_initial_graph(self):
with self.graph.as_default():
X = tf.placeholder(tf.float32, shape=some_shape)
... some code ...
def add_to_existing_graph(self):
with self.graph.as_default():
... some code adding more ops to the graph ...
def transform(self, data):
with tf.Session(graph=self.graph) as session:
y = session.run(Y, feed_dict={X: data})
return y

调用方法将如下所示

model = Model()
model.build_initial_graph()
model.add_to_existing_graph()
model.add_to_existing_graph()
result = model.transform(data)

所以,两个问题

  1. 这种方式向现有图形添加操作是否合法? 在不同的地方使用相同的图形对象,还是会覆盖旧的图形对象?
  2. 在转换方法上,运行代码时无法识别feed_dict中的X,实现该目标的正确方法是什么?

Q1:这当然是构建模型的合法方法,但更多的是意见问题。我只建议将张量存储为属性(请参阅问题 2 的答案)。self.X=....

你可以看看这篇非常好的文章,了解如何以面向对象的方式构建你的TensorFlow模型。

Q2:原因非常简单,变量X不在transform方法的范围内。
如果您执行以下操作,一切正常:

def build_initial_graph(self):
with self.graph.as_default():
self.X = tf.placeholder(tf.float32, shape=some_shape)
... some code ...
def transform(self, data):
with tf.Session(graph=self.graph) as session:
return session.run(self.Y, feed_dict={self.X: data})

更详细地说,在 TensorFlow 中,您定义的所有张量或操作(例如tf.placeholdertf.matmul) 是在你re working on. You might want to store them in Python variable, as you did by doingX = tf.placeholder'tf.Graph()中定义的,但这不是强制性的。

如果您想在访问您定义的张量之一之后,您可以

  • 使用 Python 变量(这是您的尝试,除了变量X不在方法范围内)或,
  • 使用tf.get_variable方法直接从图形中检索它们(您需要知道它的名称)。

最新更新