TensorFlow是否优化以避免不必要的图的重新执行?
我大致了解,当对一个TensorFlow图所包含的TensorFlow是否优化以避免不必要的图的重新执行?,tensorflow,Tensorflow,我大致了解,当对一个TensorFlow图所包含的张量进行求值时,该图是如何求值的:对该张量执行run或eval,将触发图中所需的所有级联计算,计算该张量的值,从而计算“导致该张量”的任何张量在图中,也将计算,并且连接它们的任何操作都将运行 因此,如果我有一个包含张量out\u a的图,它的计算涉及(可能在许多其他事情中)使用int\u b的操作,这反过来(最终)需要执行本身(最终)使用in的操作an\u op,执行 a, b, o = sess.run([out_a, int_b, an_op
张量
进行求值时,该图是如何求值的:对该张量执行run
或eval
,将触发图中所需的所有级联计算,计算该张量的值,从而计算“导致该张量”的任何张量在图中,也将计算,并且连接它们的任何操作都将运行
因此,如果我有一个包含张量out\u a
的图,它的计算涉及(可能在许多其他事情中)使用int\u b
的操作,这反过来(最终)需要执行本身(最终)使用in
的操作an\u op
,执行
a, b, o = sess.run([out_a, int_b, an_op], feed_dict={in: x})
将只计算一次out_a
、int_b
和an_op
:计算out_a
和int_b
都使用相同的an_op
执行;用于提供int\u b
的计算与用于计算out\u a
的计算相同。(例如,如果我以后引用了a
,我使用的是计算的张量out\u a
,因此不会再执行。)
但是,如果我不以这种方式组合我的操作,会发生什么情况:
o = sess.run(an_op, feed_dict={in: x})
# ... and later yet, after I remember I need `int_b`:
b = sess.run(int_b, feed_dict={in: x})
# ... later, after I remember I need `out_a`:
a = sess.run(out_a, feed_dict={in: x})
在这种情况下,TensorFlow是否进行了任何优化,以避免第二次和第三次计算a_op
,以及第二次计算int_b
,从而可能触发这些计算的副作用
在这种情况下,TensorFlow是否执行了任何优化来
避免第二次和第三次计算运算,第二次计算整数
时间,可能触发这些计算的副作用
不,由开发人员记住需要执行哪些计算,并将它们全部放在函数的列表中(按照您描述的方式)
您可以通过运行以下代码进行验证:
import tensorflow as tf
import numpy as np
from datetime import datetime
n = 3000
t = np.random.rand(n,n)
a = tf.Variable(t)
b = tf.matmul(a, a)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
在我的机器上返回:
0:00:02.798704
0:00:02.940005
0:00:03.039798
如果数据将被缓存,第二次运行将立即返回
在这种情况下,TensorFlow是否执行了任何优化来
避免第二次和第三次计算运算,第二次计算整数
时间,可能触发这些计算的副作用
不,由开发人员记住需要执行哪些计算,并将它们全部放在函数的列表中(按照您描述的方式)
您可以通过运行以下代码进行验证:
import tensorflow as tf
import numpy as np
from datetime import datetime
n = 3000
t = np.random.rand(n,n)
a = tf.Variable(t)
b = tf.matmul(a, a)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
startTime = datetime.now()
_ = sess.run(b)
print datetime.now() - startTime
在我的机器上返回:
0:00:02.798704
0:00:02.940005
0:00:03.039798
如果数据被缓存,第二次运行将很快返回。根据我的观察,您必须将所有这些变量放在一次运行中才能使用相同的执行(如案例1)。如果您确实喜欢第二种情况,第二次和第三次运行将再次执行公共ops,并给出下一个结果。根据我的观察,您必须在一次运行中放置所有这些变量以使用相同的执行(如案例1)。如果您喜欢第二种情况,则第二次和第三次运行将再次执行公共ops并给出下一个结果。该测试不应检测tensorflow是否在session.run调用之间缓存结果,因为您使用的是随机输入,一个合理的缓存实现会标记为不可缓存。@lahwran非常感谢您发现了这一点。修复了该问题。该测试不应检测tensorflow是否在session.run调用之间缓存结果,因为您使用的是随机输入,合理的缓存实现会将其标记为不可缓存。@lahwran非常感谢您发现了这一点。解决了这个问题。