创建两个 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),我想,如果我理解你的意思是正确的话。
背景
我正在通过 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" 跨会话),但它在任何时候的值都存储在每个打开的会话中。不过,变量值并不是存储在会话中的唯一内容。您还可以了解随机数生成器或数据集迭代器的状态。参见
试着更具体地回答你的问题,正确的解释是 A),我想,如果我理解你的意思是正确的话。