Я изучаю учебник TensorFlow «MNIST For ML Beginners», и я хочу распечатать потерю обучения после каждого этапа обучения.Печать потерь во время обучения TensorFlow
Мой цикл обучения в настоящее время выглядит следующим образом:
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)
дает мне ошибку ...
Спасибо!
Спасибо. Поэтому каждый раз, когда я вызываю 'sess.run ([train_step, cross_entropy])', он все равно только вычисляет «cross_entropy» один раз, правильно? Он не делает дополнительный проход вперед для каждой из переменных, которые я передаю? – Karnivaurus
Правильно - он выполняет тот же самый подграф (поскольку «cross_entropy' уже вычисляется как часть этапа обучения) и просто добавляет дополнительный узел, чтобы вернуть значение« cross_entropy »обратно в вашу программу Python. – mrry
Спасибо.Как побочный пункт, после обновления моего кода, как вы предложили, значение 'cross_entropy', в среднем, уменьшается по циклу. Однако иногда это фактически увеличивается с одной итерации обучения на другую. Это происходит для ряда ступенчатых размеров в градиентном спуске. Ожидается ли это? Разве потеря никогда не будет уменьшаться после каждой итерации, потому что вы перемещаете грузы в направлении, которое должно уменьшить эту потерю? График потери против итерации находится здесь: http://i.stack.imgur.com/f8B80.png – Karnivaurus