web-dev-qa-db-fra.com

Comment écrire sur TensorBoard dans TensorFlow 2

Je connais assez bien TensorFlow 1.x et j'envisage de passer à TensorFlow 2 pour un prochain projet. J'ai du mal à comprendre comment écrire des scalaires dans les journaux TensorBoard avec une exécution rapide , en utilisant un boucle de formation personnalisée .

Description du problème

Dans tf1, vous créiez des opérations récapitulatives (une opération pour chaque chose que vous souhaitez stocker), que vous fusionniez ensuite en une seule opération, exécutiez cette opération fusionnée dans une session, puis l'écriviez dans un fichier à l'aide d'un objet FileWriter. En supposant que sess est notre tf.Session(), un exemple de la façon dont cela a fonctionné peut être vu ci-dessous:

# While defining our computation graph, define summary ops:
# ... some ops ...
tf.summary.scalar('scalar_1', scalar_1)
# ... some more ops ...
tf.summary.scalar('scalar_2', scalar_2)
# ... etc.

# Merge all these summaries into a single op:
merged = tf.summary.merge_all()

# Define a FileWriter (i.e. an object that writes summaries to files):
writer = tf.summary.FileWriter(log_dir, sess.graph)

# Inside the training loop run the op and write the results to a file:
for i in range(num_iters):
    summary, ... = sess.run([merged, ...], ...)
    writer.add_summary(summary, i)

Le problème est que les sessions n'existent plus dans tf2 et je préférerais ne pas désactiver l'exécution désireuse pour que cela fonctionne. Le documentation officielle est écrit pour tf1 et toutes les références que je peux trouver suggèrent d'utiliser le rappel de keras Tensorboard. Cependant, pour autant que je sache, cela ne fonctionne que si vous entraînez le modèle via model.fit(...) et non via boucle de formation personnalisée .

Ce que j'ai essayé

  • La version tf1 des fonctions tf.summary, En dehors d'une session. De toute évidence, toute combinaison de ces fonctions échoue, car FileWriters, merge_ops, etc. n'existent même pas dans tf2.
  • Ce message moyen indique qu'il y a eu un "nettoyage" dans certaines API tensorflow, y compris tf.summary(). Ils suggèrent d'utiliser from tensorflow.python.ops.summary_ops_v2, Ce qui ne semble pas fonctionner. Ceci implique en utilisant un record_summaries_every_n_global_steps; plus sur cela plus tard.
  • Une série d'autres articles 1 , 2 , , suggèrent d'utiliser les tf.contrib.summary Et tf.contrib.FileWriter. Cependant, tf.contriba été supprimé du référentiel TensorFlow et du processus de génération .
  • ne vitrine TensorFlow v2 du dépôt officiel , qui utilise à nouveau les résumés tf.contrib Avec le record_summaries_every_n_global_steps Mentionné précédemment. Je n'ai pas pu faire fonctionner cela non plus (même sans utiliser la bibliothèque contrib).

tl; dr

Mes questions sont:

  • Existe-t-il un moyen d'utiliser correctement tf.summary Dans TensroFlow 2?
  • Sinon, existe-t-il un autre moyen d'écrire les journaux TensorBoard dans TensorFlow 2, lors de l'utilisation d'une boucle de formation personnalisée (pas model.fit())?
10
Javier

Oui, il existe une manière plus simple et plus élégante d'utiliser les résumés dans TensorFlow v2.

Commencez par créer un enregistreur de fichiers qui stocke les journaux (par exemple, dans un répertoire nommé log_dir):

writer = tf.summary.create_file_writer(log_dir)

Partout où vous voulez écrire quelque chose dans le fichier journal (par exemple un scalaire), utilisez votre bon vieux tf.summary.scalar dans un contexte créé par l'auteur. Supposons que vous souhaitiez stocker la valeur de scalar_1 pour l'étape i:

with writer.as_default():
    tf.summary.scalar('scalar_1', scalar_1, step=i)

Vous pouvez ouvrir autant de ces contextes que vous le souhaitez à l'intérieur ou à l'extérieur de votre boucle d'entraînement.

Exemple:

# create the file writer object
writer = tf.summary.create_file_writer(log_dir)

for i, (x, y) in enumerate(train_set):

    with tf.GradientTape() as tape:
        y_ = model(x)
        loss = loss_func(y, y_)

    grads = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(Zip(grads, model.trainable_variables))

    # write the loss value
    with writer.as_default():
        tf.summary.scalar('training loss', loss, step=i+1)
10
Djib2011