С 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
или оптимизаторы), не будут давать одинаковые результаты, когда они запускаются один раз и когда они запускаются дважды.
InВ любом случае, обратите внимание, что по состоянию на v1.12.0 partial_run
все еще является экспериментальной функцией и может быть изменено.