Używam Python API for Tensorflow. Staram się realizować Rosenbrock function podane poniżej bez użycia pętli Pythona:Opis pętli while w Tensorflow
Moja obecna implementacja jest następująca:
def rosenbrock(data_tensor):
columns = tf.unstack(data_tensor)
summation = 0
for i in range(1, len(columns) - 1):
first_term = tf.square(tf.subtract(columns[i + 1], tf.square(columns[i])))
second_term = tf.square(tf.subtract(columns[i], 1.0))
summation += tf.add(tf.multiply(100.0, first_term), second_term)
return summation
Próbowałem realizacji sumowanie w tf.while_loop()
; jednak uznałem, że interfejs API jest nieco nieintuicyjny, jeśli chodzi o używanie indeksu liczbowego, który ma pozostać oddzielony od danych. Przykład podany w documentation wykorzystuje dane jako wskaźnik (lub vice versa)
i = tf.constant(0)
c = lambda i: tf.less(i, 10)
b = lambda i: tf.add(i, 1)
r = tf.while_loop(c, b, [i])
Czy należy używać pętli for? Jaka jest korzyść z używania while_loop? Czy to konieczne? – lerner
W swoim kodzie powyżej pętla for wykona kod Pythona. Jeśli nazwiemy ciało jego pętli for "f", wtedy można pomyśleć o kodzie Pythona jako wykonywaniu f, f, f, f, f, ... f. Tak więc N wywoła tę funkcję "ciała" N, a wykres funkcji będzie miał tę funkcję N razy. Jeśli użyjesz tf.while_loop, zobaczysz tę funkcję tylko raz na wykresie. –
Zaletą tf.while_loop jest: 1) możesz wykonywać iteracje równolegle i 2) możesz mieć stałe runtime w twoich instrukcjach warunków. Na przykład, jeśli chcesz uruchomić optymalizator, dopóki nie zostanie spełniona pewna tolerancja, musisz użyć wariantu tf.while_loop, ponieważ python nie może wstępnie ocenić warunku –