В чем разница между Session.partial_run и Session.run в Tensorflow? - PullRequest
0 голосов
/ 06 декабря 2018

Я всегда думал, что Session.run требует подачи всех заполнителей на графике, в то время как Session.partial_run только те, которые указаны через Session.partial_run_setup, но, глядя дальше, это не так.

Так как именно эти два метода различаются?Каковы преимущества / недостатки использования одного над другим?

1 Ответ

0 голосов
/ 06 декабря 2018

С 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 все еще является экспериментальной функцией и может быть изменено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...