Возможно ли получить значение целевой функции на каждом этапе обучения?

В обычном цикле обучения TensorFlow, таком как

train_op = tf.train.AdamOptimizer().minimize(cross_entropy) with tf.Session() as sess: for i in range(num_steps): # ... train_op.run(feed_dict = feed_dict) 

train_op.run возвращает None .

Однако иногда полезно собирать промежуточные результаты, такие как ценность цели или точность.

Добавление дополнительных вызовов sess.run потребует повторного распространения вперед, увеличивая время выполнения:

 train_op = tf.train.AdamOptimizer().minimize(cross_entropy) with tf.Session() as sess: for i in range(num_steps): # ... o, a = sess.run([objective, accuracy], feed_dict = feed_dict) train_op.run(feed_dict = feed_dict) 

Возможно ли это сделать в TensorFlow за один раз?


Редактировать:

Люди предложили

 sess.run([objective, accuracy, train_op], feed_dict = feed_dict) 

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

 [objective, accuracy, train_op] 

который, как представляется, не определен – вы получаете разные результаты в зависимости от того, используется ли CUDA .

3 Solutions collect form web for “Возможно ли получить значение целевой функции на каждом этапе обучения?”

Просто добавьте train_op в список узлов, подлежащих оценке.

 o, a, _ = sess.run([objective, accuracy, train_op], feed_dict = feed_dict) 

Что касается этапа обучения и его порядка в оценке, я сделал следующий небольшой эксперимент:

 import tensorflow as tf x = tf.Variable(0, dtype=tf.float32) loss = tf.nn.l2_loss(x-1) train_opt = tf.train.GradientDescentOptimizer(1) train_op = train_opt.minimize(loss) init_op = tf.global_variables_initializer() sess = tf.Session() sess.run(init_op) x_val, _, loss_val = sess.run([x, train_op, loss]) # returns x_val = 1.0, loss_val = 0.5 

Ситуация более смущена, чем я изначально думал. Кажется, что данное x_val состоит в том, что порядок выполнения выборки не зависит от их соответствующей позиции в списке: x_val и loss_val будут одинаковыми независимо от их положения в списке.

Однако, как заметил @MaxB, их исполнение не гарантировано. При запуске вышеуказанного кода на графическом процессоре x_val устанавливается на 0.0, начальное значение. Однако при запуске на CPU x_val равен 1.0, то есть после обновления с train_op .

Такое поведение, зависящее от конфигурации, может быть ограничено переменными, обновляемыми с помощью тренировочных операций, как показывает приведенный выше эксперимент, но их гарантия не вытекает из документации tf.

Вы можете предоставить столько опций, сколько хотите в sess.run . В вашем случае вы используете objective и accuracy . Добавьте свой train_op . Результаты этого не нужны, поэтому вы можете использовать _ . В основном:

 o, a, _ = sess.run([objective, accuracy, train_op], feed_dict = feed_dict) 

PS относительно вашего комментария, sess.run не будет запускать график 3 раза. Кроме того, он не обязательно будет даже запускать график один раз. Он будет определять все операционные системы, которые должны быть оценены, чтобы оценить 3 вещи, которые вы предоставили, и запустите все эти операционные системы (таким образом, один раз подграфом)

Я решил проблему, используя tf.control_dependencies с дублирующей переменной loss_after_train_op для loss переменной. Я основывался на ответе @ user1735003.

Например, если вам интересно узнать значение после того, как train_op «выполнит», вы можете добавить этот код к определению модели:

 with tf.control_dependencies([train_op]): loss_after_train_op = tf.nn.l2_loss(x - 1) 

Затем, если вы просто упомянете loss_after_train_op в вызове run , он даст ожидаемый результат.

И нет, вы не можете просто повторно использовать loss снова, потому что тогда вы бы переопределили это. Напомним, что train_op уже привязан к предыдущей переменной loss , поэтому вы потеряли бы эту переменную.

Я также включаю демонстрацию:

 import tensorflow as tf x = tf.Variable(0, dtype=tf.float32) train_opt = tf.train.GradientDescentOptimizer(1) init_op = tf.global_variables_initializer() loss = tf.nn.l2_loss(x - 1) train_op = train_opt.minimize(loss) with tf.control_dependencies([train_op]): loss_after_train_op = tf.nn.l2_loss(x - 1) sess = tf.Session() sess.run(init_op) loss_val_1 = sess.run(loss) print loss_val_1 x_val, _, loss_val, loss_after_train_op_val = sess.run([x, train_op, loss, loss_after_train_op]) print x_val, loss_val, loss_after_train_op_val 

Выход

 $ python test_control_dependencies.py 0.5 1.0 0.5 0.0 $ 
  • TensorFlow: Не повторяющиеся результаты
  • Как использовать image_summary для просмотра изображений из разных партий в Tensorflow?
  • запланированная выборка в Tensorflow
  • Tensorflow seq2seq многомерная регрессия
  • Как эффективно применять градиентную обрезку в тензорном потоке?
  • использовать тензорный поток для моделирования схожести предложения
  • Установка TensorFlow в Windows (Python 3.6.x)
  • Tensorflow: одновременное прогнозирование на GPU и CPU
  •  
    Interesting Posts for Van-Lav

    Передача структурированного массива numpy со строками в функцию cython

    Вычислительный продукт i-й строки массива1 и i-й столбец array2 – NumPy

    Почему @staticmethod не сохраняется в классах, когда @classmethod?

    Есть ли причина, по которой строки Python не имеют метода длины строки?

    присвоение значения переменной оболочки с использованием возвращаемого значения функции из Python

    В Django request.REQUEST.get () содержатся параметры BOTH GET и POST?

    Использование Wordnet для создания превосходных, сравнительных и прилагательных

    re.split с пробелами в python

    Производительность между Django и raw Python

    Tensorflow: ошибка подачи корма: вы должны подать значение для тензора заполнителя

    Поиск последовательных согласных в слове

    Наилучшая практика ответа на ошибку в Django ajax

    Проблемы с установкой панели инструментов Django

    проверить os.path.isfile (имя файла) с учетом регистра в python

    Sphinx's .. include :: директива и "дублировать ярлык"

    Python - лучший язык программирования в мире.