我大致了解TensorFlow图在评估其中包含的 Tensors
之一时是如何评估的:对于该张量执行 run
或 eval
将触发图中所需的所有级联计算,计算该张量的值,结果,图中"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_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
可能会触发这些计算的副作用?
1 回答
不,是由开发人员记住需要执行哪些计算并将所有计算放在sess.run函数的列表中(以您描述的方式) .
您可以通过运行以下代码来验证它:
在我的机器上返回:
如果数据将被缓存,则第二次运行将立即返回 .