假设我的计算图只有2个节点。节点1 - >节点2(节点1的输出是节点2的输入。节点2也在节点1的输入上运行。) 计算图看起来像:
x = Node1(z)
y = Node2(x, z)
现在,如果我使用sess.run运行Node1,然后使用不同的sess.run调用运行Node2,那么 state (如x
中)是否会在调用中保留,或{{ {1}}在第二次调用时从头开始计算?
答案 0 :(得分:3)
一般情况下,除非您assign it to a tf.Variable
或enqueue it in a queue,否则TensorFlow会在不再需要时计算Session.run()
的结果时丢弃所有中间张量的值,释放记忆。
此规则的一个例外是,如果在您的程序中z
是一个常量张量,Node1()
是无状态操作(即pure function),TensorFlow可能会缓存结果作为constant folding优化的一部分,Node1()
。这种优化可以使Session.run()
的后续执行更快,但代价是第一次运行时需要额外的工作。但是,如果z
是变量,或Node1()
是有状态操作,则TensorFlow无法安全地缓存结果,并且将在每次Session.run()
调用时重新评估它。 (此外,TensorFlow当前为Session.run()
的每个不同参数集重新执行常量折叠,因此仅在运行x
时计算的Node1()
值不会在常量折叠中重复使用Node2()
。但是,此优化可以在将来添加。)