TensorFlow是否会进行优化以避免不必要的图形重新执行?

时间:2017-06-05 20:50:01

标签: tensorflow

我理解 当评估TensorFlow图中包含的Tensors之一时,如何评估TensorFlow图:执行该张量的runeval将触发图中所需的所有级联计算,计算该张量的值,因此,图中“导致它”的任何张量也将被计算,并且任何连接它们的操作都将被运行。

因此,如果我有一个包含张量out_a的图形,其计算涉及(可能在许多其他事物中)使用int_b的操作,而这些操作反过来(最终)需要执行操作an_op,它本身(最终)使用in,执行

a, b, o = sess.run([out_a, int_b, an_op], feed_dict={in: x})

只评估out_aint_ban_op out_aint_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,可能会触发这些计算的副作用?

1 个答案:

答案 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

如果数据将被缓存,则第二次运行将立即返回。