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