创建两个TensorFlow会话时是否创建了图的多个实例?

时间:2019-06-05 13:02:36

标签: python multithreading tensorflow conceptual

背景

我通过遍历Hands-On Machine Learning with Scikit-Learn and TensorFlow的第二部分来学习TensorFlow,练习题之一是( bounded 我自己添加的文字以使问题更清楚):

“如果您创建包含变量g的图形w,则启动两个线程并在每个线程中打开一个会话,都使用同一图形g ,每个会话将拥有自己的变量w副本还是将其共享?”

本书背面提供的答案如下:

“在本地TensorFlow中,会话管理变量值,因此,如果创建包含变量g的图w,则启动两个线程并在每个线程中打开一个本地会话,相同的图形g ,则每个会话将拥有自己的变量w ...的副本。”

我的问题

A) B)是对正在发生的事情的正确解释吗?

A)。这两个会话都使用图形g的相同 instance ,并且两个单独的变量仅归因于两个单独的会话。

B)通过两个不同会话的实例化,两个线程使用图g的相同体系结构,但是两个单独的实例化图g被创建,导致两个不同的变量。

2 个答案:

答案 0 :(得分:1)

我认为这里的问题是术语“实例化”的含糊之处,以及图形和会话的实际含义。

如果您有一个图和两个打开的会话,则该图只有一个实例。这是一个Python对象,它描述了模型执行的计算,即张量之间的操作,其中可能包括一些常数和变量。如果向该图添加新元素(新操作),则两个会话都可以访问该元素。重要的是要了解图是静态的,也就是说,它们没有状态,并且它们本身不进行任何计算,它们只是描述如何执行计算。可以将其视为计算机程序源代码的模拟。

会话是一个对象,该对象存储可以在其上执行计算的图形状态。最重要的是,该“状态”包含图形中变量的值。因此,变量对象本身是图的一部分(从某种意义上来说,是跨会话“共享”的),但是它随时具有的值存储在每个打开的会话中。但是,变量值并不是会话中存储的唯一内容。您还拥有随机数生成器或数据集迭代器的状态。参见What is a “stateful object” in tensorflow?。按照之前的类比,会话将类似于执行图形为源代码的程序所使用的内存和CPU。

如果我想理解您的意思,那么我想尝试更具体地回答您的问题,正确的解释是 A)

答案 1 :(得分:0)

让我们检查一下会发生什么:

tf.reset_default_graph()
w = tf.Variable(tf.random_uniform([2,3]), name="w")
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    w1 = sess.run(w)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    w2 = sess.run(w)

assert np.testing.assert_equal(w1, w2)

我们得到一个断言错误。这意味着 B)是正确的答案。