首页 文章

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

提问于
浏览
0

我大致了解TensorFlow图在评估其中包含的 Tensors 之一时是如何评估的:对于该张量执行 runeval 将触发图中所需的所有级联计算,计算该张量的值,结果,图中"lead to it"的任何张量也将被计算,并且任何连接它们的操作都将被运行 .

因此,如果我有一个包含张量 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_opout_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 回答

  • 2

    在这种情况下TensorFlow是否有任何优化以避免第二次和第三次计算an_op,第二次计算int_b,可能会触发这些计算的副作用?

    不,是由开发人员记住需要执行哪些计算并将所有计算放在sess.run函数的列表中(以您描述的方式) .

    您可以通过运行以下代码来验证它:

    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
    

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

相关问题