ace*_*123 5 session tensorflow
我一直认为Session.run需要输入图中的所有占位符,而Session.partial_run只输入通过 指定的占位符Session.partial_run_setup,但进一步看情况并非如此。
那么这两种方法究竟如何区分呢?使用其中一种的优点/缺点是什么?
使用 时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})
Run Code Online (Sandbox Code Playgroud)
计算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)
Run Code Online (Sandbox Code Playgroud)
与之前不同,这里的操作some_expensive_operation总共只会运行一次,因为 的计算result2只是 的计算的延续result1。
这在多种情况下都很有用,例如,如果您想将一次运行的计算成本分成几个步骤,而且如果您需要在 TensorFlow 中进行一些中期评估检查,例如计算后半部分的输入根据前半部分的输出来决定图的形状,或者根据中间结果来决定是否完成评估(这些也可以在 TensorFlow 中实现,但在某些情况下您可能不希望这样做)。
还要注意,这不仅仅是避免重复计算的问题。许多操作的状态在每次评估时都会发生变化,因此两次单独评估和一次评估分为两个部分评估的结果实际上可能不同。随机操作就是这种情况,每次运行都会获得一个新的不同值,以及其他有状态对象(例如迭代器)。变量显然也是有状态的,因此更改变量的操作(例如tf.Session.assign优化器)在运行一次和运行两次时不会产生相同的结果。
无论如何,请注意,从 v1.12.0 开始,它partial_run仍然是一个实验性功能,可能会发生变化。
| 归档时间: |
|
| 查看次数: |
518 次 |
| 最近记录: |