我理解 当评估TensorFlow图中包含的Tensors
之一时,如何评估TensorFlow图:执行该张量的run
或eval
将触发图中所需的所有级联计算,计算该张量的值,因此,图中“导致它”的任何张量也将被计算,并且任何连接它们的操作都将被运行。
因此,如果我有一个包含张量out_a
的图形,其计算涉及(可能在许多其他事物中)使用int_b
的操作,而这些操作反过来(最终)需要执行操作an_op
,它本身(最终)使用in
,执行
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_b
的计算与计算out_a
中使用的计算相同。 (例如,如果我稍后引用a
,我将使用已评估的张量out_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在这种情况下是否进行了任何优化以避免第二次和第三次计算an_op
,第二次计算int_b
,可能会触发这些计算的副作用?
答案 0 :(得分:2)
TensorFlow在这种情况下是否执行了任何优化 避免第二次和第三次计算an_op,而第二次计算int_b 时间,可能会触发那些计算的副作用?
不,开发人员需要记住需要执行哪些计算,并将所有计算放在sess.run函数的列表中(按您所描述的方式)。
您可以通过运行以下代码进行验证:
# usage: fab show_users:[dev|stage|prod]
def show_users(tier):
env.tier = tier
if env.tier=="dev":
env.host_string = 'web01'
DB_HOST = 'db01'
elif env.tier=="stage":
env.host_string = 'web02'
DB_HOST = 'db02'
elif env.tier=="prod":
env.host_string = 'web03'
DB_HOST = 'db03'
else:
print "Error: Tier %s is not a valid server tier name." % (tier)
exit(1)
cmd = "psql -h {0} -U {1} -d {2} -c 'SELECT id, username FROM auth_user;'".format(DB_HOST, env.me, env.db)
run(cmd)
在我的机器上返回:
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
如果数据将被缓存,则第二次运行将立即返回。