Подтвердить что ты не робот

Печать потерь во время обучения TensorFlow

Я смотрю учебник TensorFlow "MNIST For ML Beginners", и я хочу распечатать потерю обучения после каждого этапа обучения.

Мой цикл тренировки в настоящее время выглядит следующим образом:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

Теперь train_step определяется как:

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)

Где cross_entropy - потеря, которую я хочу распечатать:

cross_entropy = -tf.reduce_sum(y_ * tf.log(y))

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

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    print 'loss = ' + str(cross_entropy)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

Теперь у меня есть два вопроса:

  • Учитывая, что cross_entropy уже вычисляется во время sess.run(train_step, ...), представляется неэффективным его вычислять дважды, требуя в два раза больше передовых проходов всех данных обучения. Есть ли способ получить доступ к значению cross_entropy, когда он был вычислен во время sess.run(train_step, ...)?

  • Как мне даже распечатать tf.Variable? Использование str(cross_entropy) дает мне ошибку...

Спасибо!

4b9b3361

Ответ 1

Вы можете получить значение cross_entropy, добавив его в список аргументов sess.run(...). Например, ваш for -loop можно переписать следующим образом:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    _, loss_val = sess.run([train_step, cross_entropy],
                           feed_dict={x: batch_xs, y_: batch_ys})
    print 'loss = ' + loss_val

Такой же подход можно использовать для печати текущего значения переменной. Скажем, помимо значения cross_entropy вы хотели напечатать значение tf.Variable, называемое W, вы могли бы сделать следующее:

for i in range(100):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    _, loss_val, W_val = sess.run([train_step, cross_entropy, W],
                                  feed_dict={x: batch_xs, y_: batch_ys})
    print 'loss = %s' % loss_val
    print 'W = %s' % W_val

Ответ 2

Вместо того, чтобы просто запустить training_step, запустите также cross_entropy node, чтобы его значение было возвращено вам. Помните, что:

var_as_a_python_value = sess.run(tensorflow_variable)

предоставит вам то, что вы хотите, чтобы вы могли сделать это:

[_, cross_entropy_py] = sess.run([train_step, cross_entropy],
                                 feed_dict={x: batch_xs, y_: batch_ys})

как запустить тренировку, так и вывести значение кросс-энтропии, как она была вычислена во время итерации. Обратите внимание, что я включил оба аргумента в sess.run и возвращаемые значения в список, чтобы оба произошли.