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

我大致了解,当对一个TensorFlow图所包含的
张量
进行求值时,该图是如何求值的:对该张量执行
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非常感谢您发现了这一点。解决了这个问题。