背景
我通过遍历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
的被创建,导致两个不同的变量。
答案 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)是正确的答案。