我一直认为Session.run
要求馈送图形中的所有占位符,而Session.partial_run
仅需要通过Session.partial_run_setup
指定的占位符,但进一步来看情况并非如此。
那么这两种方法到底有何区别?与另一种相比,使用一种有什么优点/缺点?
答案 0 :(得分:2)
通常使用tf.Session.run
给出一些输入和期望的输出,TensorFlow会在图中运行这些运算以计算并返回这些输出。如果以后要获得其他输出,即使它具有相同的输入,则即使某些中间结果与上一次调用中的结果相同,也必须再次运行图中的所有必要操作。例如,考虑这样的事情:
import tensorflow as tf
input_ = tf.placeholder(tf.float32)
result1 = some_expensive_operation(input_)
result2 = another_expensive_operation(result1)
with tf.Session() as sess:
x = ...
sess.run(result1, feed_dict={input_: x})
sess.run(result2, feed_dict={input_: x})
计算result2
将需要同时运行some_expensive_operation
和another_expensive_operation
的操作,但是实际上大多数计算是从计算result1
开始重复进行的。 tf.Session.partial_run
允许您评估图形的一部分,“保留”该评估,并在以后完成。例如:
import tensorflow as tf
input_ = tf.placeholder(tf.float32)
result1 = some_expensive_operation(input_)
result2 = another_expensive_operation(result1)
with tf.Session() as sess:
x = ...
h = sess.partial_run_setup([result1, result2], [input_ ])
sess.partial_run(h, result1, feed_dict={input_: x})
sess.partial_run(h, result2)
与以前不同,some_expensive_operation
的操作总共只运行一次,因为result2
的计算只是result1
的计算的延续。
在某些情况下这很有用,例如,如果您要将运行的计算成本划分为多个步骤,而且还需要从TensorFlow中进行一些中间评估检查,例如计算输入图的后半部分取决于上半部分的输出,或者取决于中间结果来决定是否完成评估(这些也可以在TensorFlow中实现,但是在某些情况下您可能不希望这样)。
也请注意,这不仅仅是避免重复计算的问题。许多操作的状态会因每次评估而改变,因此,两个单独的评估和一个评估分为两个部分评估的结果实际上可能会有所不同。随机操作就是这种情况,在这种情况下,每次运行和其他有状态对象(如迭代器)都会获得不同的新值。变量显然也是有状态的,因此更改变量的操作(如tf.Session.assign
或优化程序)在运行一次和运行两次时将不会产生相同的结果。
无论如何,请注意,从v1.12.0版本开始,partial_run
仍是实验性功能,随时可能更改。