Czy wewnętrznie rozwija wykres, tj. czy tworzy on w locie statyczny wykres z kopiami podgrupy korpusu pętli, czy też zarządza aktywacjami do przodu tylko dla backprop w różnych lokalizacjach pamięci dla każdej iteracji pętli, bez wyraźnego rozszerzania wykresu.
Odpowiedzi:
0 dla odpowiedzi № 1Takie pętle nie są jawnie rozwijane. Rozumiem przez to, że jeśli tf.while_loop
musi działać 100 razy, na wykresie nie będzie 100 wywołań funkcji ciała. Na przykład załóżmy, że chcemy użyć tensorflow do obliczeń x^N
(lub x**N
w języku python). Jednym ze sposobów na zrobienie tego byłoby:
import tensorflow as tf
N = tf.constant(100)
i = tf.constant(0)
x = tf.constant(1.5)
def body(i, x, x0):
return i + 1, x * x0, x0
output = tf.while_loop( lambda i,x,x0: i < N-1, body, [i, x, x] );
with tf.Session() as sess:
writer = tf.summary.FileWriter("while_loop_example")
writer.add_graph(sess.graph)
print(sess.run(output))
Ciało tej pętli musi działać 99 razy. Jeśli jednak spojrzymy na wykres (za pomocą polecenia „tensorboard --logdir while_loop_example
„), otrzymujemy to:
Wykres nie zmienia się, jeśli zmienię liczbę iteracji pętli.