后续调用sess.run()擦除状态?

时间:2016-08-29 03:47:24

标签: tensorflow

假设我的计算图只有2个节点。节点1 - >节点2(节点1的输出是节点2的输入。节点2也在节点1的输入上运行。) 计算图看起来像:

x = Node1(z)

y = Node2(x, z)

现在,如果我使用sess.run运行Node1,然后使用不同的sess.run调用运行Node2,那么 state (如x中)是否会在调用中保留,或{{ {1}}在第二次调用时从头开始计算?

1 个答案:

答案 0 :(得分:3)

一般情况下,除非您assign it to a tf.Variableenqueue 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()。但是,此优化可以在将来添加。)