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 .
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 .
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.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.tf.contrib.summary
Et tf.contrib.FileWriter
. Cependant, tf.contrib
a été supprimé du référentiel TensorFlow et du processus de génération .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).Mes questions sont:
tf.summary
Dans TensroFlow 2?model.fit()
)?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)