Imprimiendo la pérdida durante el entrenamiento TensorFlow

Estoy viendo el tutorial de TensorFlow ” MNIST For ML Beginners “, y quiero imprimir la pérdida de entrenamiento después de cada paso de entrenamiento.

Mi ciclo de entrenamiento actualmente es 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 computar explícitamente cross_entropy en el ciclo 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 con respecto a esto:

  1. Dado que cross_entropy ya se ha calculado durante sess.run(train_step, ...) , parece ineficiente calcularlo dos veces, lo que requiere 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 incluso imprimir una tf.Variable ? Usar str(cross_entropy) me da un error …

¡Gracias!

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 como sigue:

 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 

Se puede utilizar el mismo enfoque para imprimir el valor actual de una variable. Digamos que, además del valor de cross_entropy , desea imprimir el valor de una tf.Variable llamada 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 

En lugar de simplemente ejecutar training_step, ejecute también el nodo cross_entropy para que se le devuelva su valor. Recuérdalo:

 var_as_a_python_value = sess.run(tensorflow_variable) 

Te daré lo que quieras, 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 convertí los argumentos de sess.run y los valores de retorno en una lista para que ambos sucedan.