web-dev-qa-db-fra.com

Comment puis-je utiliser le tensorboard avec tf.estimator.Estimator

J'envisage de déplacer ma base de code vers tf.estimator.Estimator , mais je ne trouve pas d'exemple sur la façon de l'utiliser en combinaison avec des résumés de tensorboard.

MWE:

import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

# Declare list of features, we only have one real-valued feature
def model(features, labels, mode):
    # Build a linear model and predict values
    W = tf.get_variable("W", [1], dtype=tf.float64)
    b = tf.get_variable("b", [1], dtype=tf.float64)
    y = W*features['x'] + b
    loss = tf.reduce_sum(tf.square(y - labels))

    # Summaries to display for TRAINING and TESTING
    tf.summary.scalar("loss", loss)    
    tf.summary.image("X", tf.reshape(tf.random_normal([10, 10]), [-1, 10, 10, 1])) # dummy, my inputs are images

    # Training sub-graph
    global_step = tf.train.get_global_step()
    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1))

    return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss= loss,train_op=train)

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')
# define our data set
x=np.array([1., 2., 3., 4.])
y=np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x": x}, y, 4, num_epochs=1000)

for Epoch in range(10):
    # train
    estimator.train(input_fn=input_fn, steps=100)
    # evaluate our model
    estimator.evaluate(input_fn=input_fn, steps=10)

Comment afficher mes deux résumés sur le tensorboard? Dois-je enregistrer un hook dans lequel j'utilise un tf.summary.FileWriter ou autre chose?

11
Manuel Schmidt

EDIT: Lors des tests (dans la v1.1.0, et probablement dans les versions ultérieures également), il est évident que tf.estimator.Estimator Écrira automatiquement des résumés pour vous. J'ai confirmé cela en utilisant le code OP et le tensorboard.

(Un coup d'œil à r1.4 me conduit à conclure que cette écriture de résumé automatique se produit en raison de tf.train.MonitoredTrainingSession .)

En fin de compte, le résumé automatique est accompli avec l'utilisation de crochets, donc si vous souhaitez personnaliser le résumé par défaut de l'estimateur, vous pouvez le faire en utilisant des crochets. Voici les détails (modifiés) de la réponse originale.


Vous voudrez utiliser des crochets, anciennement connus sous le nom de moniteurs . (Linked est un guide conceptuel/de démarrage rapide; en bref, la notion de connexion/surveillance de la formation est intégrée dans l'API Estimator. Un peu confus, cependant, il ne semble pas que la dépréciation des moniteurs pour les hooks soit vraiment documenté sauf dans une annotation de dépréciation dans le code source réel ...)

Selon votre utilisation, il semble que la version r1.2 SummarySaverHook correspond à votre facture.

summary_hook = tf.train.SummarySaverHook(
    SAVE_EVERY_N_STEPS,
    output_dir='/tmp/tf',
    summary_op=tf.summary.merge_all())

Vous souhaiterez peut-être personnaliser les paramètres d'initialisation du crochet, comme en fournissant un récapitulatif explicite ou en écrivant toutes les N secondes au lieu de N étapes.

Si vous passez ceci dans le EstimatorSpec, vous obtiendrez votre comportement Résumé personnalisé:

return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss=loss,
                                  train_op=train,
                                  training_hooks=[summary_hook])

MODIFIER LA REMARQUE: Une version précédente de cette réponse suggérait de passer le summary_hook Dans estimator.train(input_fn=input_fn, steps=5, hooks=[summary_hook]). Cela ne fonctionne pas car tf.summary.merge_all() doit être appelée dans le même contexte que votre graphique de modèle.

14
jagthebeetle

Pour moi, cela a fonctionné sans l'ajout de crochets ou d'appels merge_all. Je viens d'ajouter quelques tf.summary.image(...) dans mon model_fn Et quand je forme le modèle, ils apparaissent comme par magie dans le tensorboard. Je ne sais pas quel est le mécanisme exact, cependant. J'utilise TensorFlow 1.4.

8
simlmx

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')

Code model_dir='/tmp/tf' signifie que l'estimateur écrit tous les journaux dans /tmp/tf, puis exécutez tensorboard --log.dir=/tmp/tf, ouvrez votre navigateur avec l'url: http: // localhost "6006, vous pouvez voir le graphique

2
gong situ

Vous pouvez créer un SummarySaverHook avec tf.summary.merger_all() comme résumé_op dans le model_fn lui-même. Passez ce crochet au paramètre training_hooks Du constructeur EstimatorSpec dans votre model_fn.

Je ne pense pas que ce que @jagthebeetle a dit soit exactement applicable ici. Comme les hooks que vous transférez à la méthode estimator.train Ne peuvent pas être exécutés pour les résumés que vous définissez dans votre model_fn, car ils ne seront pas ajoutés à l'opération merge_all Car ils restent limités par le portée de model_fn

1
Ankit Mundada