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:

  1. Dado que cross_entropy ya se calcula durante sess.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 de cross_entropy cuando se calculó durante sess.run(train_step, ...)?

  2. ¿Cómo puedo imprimir un tf.Variable? Usar str(cross_entropy) me da un error...

¡Gracias!

Author: imsrgadich, 2015-11-20

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
 39
Author: mrry,
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.

 3
Author: dga,
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