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

Are multiple instantiations of a graph created when two TensorFlow sessions are created?

背景

我正在通过 Hands-On Machine Learning with Scikit-Learn and TensorFlow 的第二部分学习 TensorFlow,其中一个练习题是( 加粗 文字是我自己添加的内容,以增加问题的清晰度):

"If you create a graph g containing a variable w, then start two threads and open a session in each thread, both using the same graph g, will each session have its own copy of the variable w or will it be shared?"

书后提供的答案如下:

"In local TensorFlow, session manage variable values, so if you create a graph g containing variable w, then start two threads and open a local session in each thread, both using the same graph g, then each session will have its own copy of the variable w..."

我的问题

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

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

B) 随着两个不同会话的实例化,两个线程使用相同的架构g ,但是创建了图 g 两个单独的实例化 ,从而导致两个不同的变量。

让我们看看会发生什么:

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) 是正确答案。

我认为这里的问题是术语 "instantiation" 以及图表和会话实际上是什么的歧义。

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

会话是一个对象,它存储可以在其上执行计算的图的状态。这个 "state" 最重要的是包含图中变量的值。因此,变量对象本身是图的一部分(从这个意义上讲,"shared" 跨会话),但它在任何时候的值都存储在每个打开的会话中。不过,变量值并不是存储在会话中的唯一内容。您还可以了解随机数生成器或数据集迭代器的状态。参见 。按照之前的类比,会话类似于内存和 CPU 用于执行程序,该程序的图形是源代码。

试着更具体地回答你的问题,正确的解释是 A),我想,如果我理解你的意思是正确的话。