Порядок sess.run ([op1, op2…]) в Tensorflow

1

Интересно, каков порядок выполнения списка операций в sess.run(ops_list,...). например: для типичного сценария классификации: _, loss = sess.run([train_op, loss_op]), если train_op запускается первым, тогда потеря - это потеря после текущей train_op. Но если loss запускается первым, то убыток - это потеря до текущего backprop. кто-нибудь поможет мне? Благодарю.

Теги:
tensorflow

1 ответ

0

loss будет значением потери до обновления, вызванного train_op. Обратите внимание, что loss_op является входом для оптимизатора, поэтому он обязательно идет "до" train_op на графике. loss_op вычисляется со значениями переменной в начале операции run. Если вы хотите вычислить потери после train_op, вы можете сделать это, например, с помощью блока tf.control_dependencies с оптимизатором и снова вычислить потери, но в этом случае вы будете делать два прямых прохода вашей модели на каждом шаге, с сопутствующая стоимость. Обычно, если вы просто хотите отобразить потери для мониторинга или что-то в этом роде, можно использовать значение из предыдущего шага.

Для дальнейшего объяснения, в общем, порядок, в котором выполняются операции TensorFlow, гарантируется только в той степени, в которой эти операции зависят друг от друга, и он не связан с порядком, в котором они передаются для run. В вашем случае train_op зависит от loss_op, поэтому loss_op должен идти первым. Однако в других случаях операции не зависят напрямую друг от друга, и в этом случае порядок не гарантируется. Много раз это не имеет значения, но в некоторых случаях это имеет значение. Рассмотрим следующий пример:

import tensorflow as tf

v = tf.Variable(0)
v2 = 2 * v
v_update = v.assign(v + 1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        print(sess.run([v_update, v2]))

Запуск на моем компьютере произвел этот вывод:

[1, 0]
[2, 2]
[3, 4]
[4, 8]
[5, 10]

Как видите, v2 иногда вдвое больше обновленного значения, а иногда вдвое больше не обновленного значения. Если, например, мы хотим убедиться, что v2 всегда запускается до v_update мы можем сделать:

import tensorflow as tf

v = tf.Variable(0)
v2 = 2 * v
with tf.control_dependencies([v2]):
    v_update = v.assign(v + 1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for i in range(5):
        print(sess.run([v_update, v2]))

Который последовательно производит:

[1, 0]
[2, 2]
[3, 4]
[4, 6]
[5, 8]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню