python - que - tensorflow redes neuronales
Mostrar entrenamiento y precisión de validación en TensorFlow usando el mismo gráfico (2)
Tengo un modelo TensorFlow, y una parte de este modelo evalúa la precisión. La accuracy
es solo otro nodo en el gráfico de flujo de tensor, que toma logits
y labels
.
Cuando quiero trazar la precisión del entrenamiento, esto es simple: tengo algo como:
tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
writer = tf.train.SummaryWriter(''/me/mydir/'', graph=sess.graph)
Luego, durante mi ciclo de entrenamiento, tengo algo como:
for n in xrange(1000):
...
summary, ..., ... = sess.run([summary_op, ..., ...], feed_dict)
writer.add_summary(summary, n)
...
También dentro de ese bucle for, cada palabra, 100 iteraciones, quiero evaluar la precisión de la validación . Tengo un feed_dict por separado para esto, y puedo evaluar muy bien la precisión de validación en Python.
Sin embargo, aquí está mi problema: quiero hacer otro resumen para la precisión de la validación , utilizando el nodo de accuracy
. Sin embargo, no tengo claro cómo hacerlo. Como tengo el nodo de accuracy
, tiene sentido que pueda volver a utilizarlo, pero no estoy seguro de cómo hacerlo exactamente, de modo que también pueda obtener la precisión de validación escrita como un resumen escalar separado ...
¿Cómo podría ser esto posible?
Para ejecutar la misma operación pero obtener resúmenes con diferentes datos de feed_dict, simplemente adjunte dos operaciones de resumen a esa operación. Supongamos que desea ejecutar la precisión de operación tanto en la validación como en los datos de prueba y desea obtener resúmenes para ambos:
validation_acc_summary = tf.summary.scalar(''validation_accuracy'', accuracy) # intended to run on validation set
test_acc_summary = tf.summary.scalar(''test_accuracy'', accuracy) # intended to run on test set
with tf.Session() as sess:
# do your thing
# ...
# accuracy op just needs labels y_ and input x to compute logits
validation_summary_str = sess.run(validation_acc_summary, feed_dict=feed_dict={x: mnist.validation.images,y_: mnist.validation.labels})
test_summary_str = sess.run(test_acc_summary, feed_dict={x: mnist.test.images,y_: mnist.test.labels})
# assuming you have a tf.summary.FileWriter setup
file_writer.add_summary(validation_summary_str)
file_writer.add_summary(test_summary_str)
También recuerde que siempre puede extraer datos crudos (escalares) del protobuff summary_str como este y hacer su propio registro.
Puede reutilizar el nodo de precisión pero necesita usar dos SummaryWriters diferentes, uno para las ejecuciones de entrenamiento y otro para los datos de prueba. También debe asignar el resumen escalar para la precisión de una variable.
accuracy_summary = tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
summaries_dir = ''/me/mydir/''
train_writer = tf.train.SummaryWriter(summaries_dir + ''/train'', sess.graph)
test_writer = tf.train.SummaryWriter(summaries_dir + ''/test'')
Luego, en su ciclo de entrenamiento, tiene el entrenamiento normal y registra sus resúmenes con train_writer. Además, ejecuta el gráfico en el conjunto de pruebas en cada centésima iteración y registra solo el resumen de precisión con el test_writer.
# Record train set summaries, and train
summary, _ = sess.run([summary_op, train_step], feed_dict=...)
train_writer.add_summary(summary, n)
if n % 100 == 0: # Record summaries and test-set accuracy
summary, acc = sess.run([accuracy_summary, accuracy], feed_dict=...)
test_writer.add_summary(summary, n)
print(''Accuracy at step %s: %s'' % (n, acc))
A continuación, puede señalar TensorBoard al directorio principal (dir_sumir) y cargará ambos conjuntos de datos.
Esto también se puede encontrar en el https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html de los procedimientos de TensorFlow.