Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Tensorflow, what is the difference between Session.partial_run and Session.run?

Tags:

I always thought that Session.run required all placeholders in the graph to be fed, while Session.partial_run only the ones specified through Session.partial_run_setup, but looking further that is not the case.

So how exactly do the two methods differentiate? What are the advantages/disadvantages of using one over the other?

like image 345
acester123 Avatar asked Dec 06 '18 10:12

acester123


1 Answers

With tf.Session.run, you usually give some inputs and expected outputs, and TensorFlow runs the operations in the graph to compute and return those outputs. If you later want to get some other output, even if it is with the same input, you have to run again all the necessary operations in the graph, even if some intermediate results will be the same as in the previous call. For example, consider something like this:

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})

Computing result2 will require to run both the operations from some_expensive_operation and another_expensive_operation, but actually most of the computation is repeated from when result1 was calculated. tf.Session.partial_run allows you to evaluate part of a graph, leave that evaluation "on hold" and complete it later. For example:

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)

Unlike before, here the operations from some_expensive_operation will only we run once in total, because the computation of result2 is just a continuation from the computation of result1.

This can be useful in several contexts, for example if you want to split the computational cost of a run into several steps, but also if you need to do some mid-evaluation checks out of TensorFlow, such as computing an input to the second half of the graph that depends on an output of the first half, or deciding whether or not to complete an evaluation depending on an intermediate result (these may also be implemented within TensorFlow, but there may be cases where you do not want that).

Note too that it is not only a matter of avoiding repeating computation. Many operations have a state that changes on each evaluation, so the result of two separate evaluations and one evaluation divided into two partial ones may actually be different. This is the case with random operations, where you get a new different value per run, and other stateful object like iterators. Variables are also obviously stateful, so operations that change variables (like tf.Session.assign or optimizers) will not produce the same results when they are run once and when they are run twice.

In any case, note that, as of v1.12.0, partial_run is still an experimental feature and is subject to change.

like image 163
jdehesa Avatar answered Oct 06 '22 00:10

jdehesa