Impresión de la pérdida durante el entrenamiento TensorFlow
Estoy viendo el tutorial TensorFlow " MNIST For ML Beginners", y quiero imprimir la pérdida de entrenamiento después de cada paso de entrenamiento.
Mi bucle de entrenamiento actualmente se ve así:
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})
Ahora, train_step
se define como:
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
Donde cross_entropy
es la pérdida que quiero imprimir:
cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
Una forma de imprimir esto sería calcular explícitamente cross_entropy
en el bucle de entrenamiento:
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})
Ahora tengo dos preguntas sobre esto:
Dado que
cross_entropy
ya se calcula durantesess.run(train_step, ...)
, parece ineficiente calcularlo dos veces, requiriendo el doble del número de pases hacia adelante de todos los datos de entrenamiento. ¿Hay alguna forma de acceder al valor decross_entropy
cuando se calculó durantesess.run(train_step, ...)
?¿Cómo puedo imprimir un
tf.Variable
? Usarstr(cross_entropy)
me da un error...
¡Gracias!
2 answers
Puede obtener el valor de cross_entropy
agregándolo a la lista de argumentos de sess.run(...)
. Por ejemplo, su for
-loop podría reescribirse de la siguiente manera:
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
El mismo enfoque se puede utilizar para imprimir el valor actual de una variable. Digamos que, además del valor de cross_entropy
, desea imprimir el valor de un tf.Variable
llamado W
, podría hacer lo siguiente:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-20 19:26:32
En lugar de simplemente ejecutar training_step, ejecute también el nodo cross_entropy para que se le devuelva su valor. Recuerde que:
var_as_a_python_value = sess.run(tensorflow_variable)
Te dará lo que quieres, para que puedas hacer esto:
[_, cross_entropy_py] = sess.run([train_step, cross_entropy],
feed_dict={x: batch_xs, y_: batch_ys})
Para ejecutar el entrenamiento y extraer el valor de la entropía cruzada tal como se calculó durante la iteración. Tenga en cuenta que volví ambos argumentos a sess.ejecutar y los valores devueltos en una lista para que ambos sucedan.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-20 19:25:19