Comment utiliser le rappel Tensorboard de Keras?

143

J'ai construit un réseau neuronal avec Keras. Je visualiserais ses données par Tensorboard, donc j'ai utilisé:

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,
                            write_graph=True, write_images=True)

comme expliqué dans keras.io . Lorsque j'exécute le rappel, je reçois <keras.callbacks.TensorBoard at 0x7f9abb3898>, mais je n'obtiens aucun fichier dans mon dossier "Graph". Y a-t-il un problème dans la façon dont j'ai utilisé ce rappel?

Simone
la source
3
Je suggérerais de régler histogram_freqsur 1. "histogram_freq: fréquence (en époques) à laquelle calculer les histogrammes d'activation pour les couches du modèle. S'il est défini sur 0, les histogrammes ne seront pas calculés."
Matt Kleinsmith
10
Attention: "/ Graph" crée un répertoire dans le répertoire racine, tandis que "./Graph" en crée un dans le répertoire de travail.
Matt Kleinsmith
@MattKleinsmith Si défini sur 0, seuls les histogrammes d'activation et de pondération des couches du modèle ne seront pas calculés via les données de validation, les métriques seront toujours enregistrées.
BugKiller
Je pense qu'il est préférable de donner un nom unique à logdir regardez stackoverflow.com/a/54949146/1179925
mrgloom

Réponses:

219
keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

Cette ligne crée un objet Callback Tensorboard, vous devez capturer cet objet et le donner à la fitfonction de votre modèle.

tbCallBack = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
...
model.fit(...inputs and parameters..., callbacks=[tbCallBack])

De cette façon, vous avez donné votre objet de rappel à la fonction. Il sera exécuté pendant la formation et produira des fichiers pouvant être utilisés avec tensorboard.

Si vous souhaitez visualiser les fichiers créés lors de la formation, exécutez dans votre terminal

tensorboard --logdir path_to_current_dir/Graph 

J'espère que cela t'aides !

Nassim Ben
la source
J'ai utilisé ceci avec l'erreur suivante lorsque write_images = False
abdul qayyum
InvalidArgumentError (voir ci-dessus pour le traçage): Tensor doit être 4-D avec le dernier dim 1, 3 ou 4, pas [1,3,3,256,256,1] [[Node: conv_3.2_2 / kernel_0_1 = ImageSummary [T = DT_FLOAT, bad_color = Tensor <type: uint8 shape: [4] values: 255 0 0 ...>, max_images = 3, _device = "/ job: localhost / replica: 0 / task: 0 / cpu: 0"] (conv_3. 2_2 / kernel_0_1 / tag, ExpandDims_50)]]
abdul qayyum
Et quelque chose indiquant que l'espace réservé est manquant dtype = float lorsque True Any Idea?
abdul qayyum
2
L'onglet Scalaires est toujours vide, bien que je puisse voir l'architecture de mon modèle dans l'onglet Graphiques?
iratzhash
1
cela ne produit que des scalaires pour la perte et la précision de l'entraînement. comment faire de même pour les données de validation qui sont passées à la fonction fit?
Utku Ufuk
46

Voici comment vous utilisez le rappel TensorBoard :

from keras.callbacks import TensorBoard

tensorboard = TensorBoard(log_dir='./logs', histogram_freq=0,
                          write_graph=True, write_images=False)
# define model
model.fit(X_train, Y_train,
          batch_size=batch_size,
          epochs=nb_epoch,
          validation_data=(X_test, Y_test),
          shuffle=True,
          callbacks=[tensorboard])
Martin Thoma
la source
2
Existe-t-il un moyen de mieux structurer la sortie du tensorboard? Keras fait-il une optimisation à cet égard?
Nickpick
2
@nickpick Je ne sais pas ce que tu veux dire. Mais je pense que cela pourrait être un candidat pour une autre question.
Martin Thoma
Il est important de noter que ce histogram_freq=0paramètre est défini si le tensorboard n'enregistre aucun histogramme par tf.summary.histogram- sinon, il histogram_freqn'est PAS égal à 0!
Agile Bean
20

Changement

keras.callbacks.TensorBoard(log_dir='/Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

à

tbCallBack = keras.callbacks.TensorBoard(log_dir='Graph', histogram_freq=0,  
          write_graph=True, write_images=True)

et définissez votre modèle

tbCallback.set_model(model)

Exécutez dans votre terminal

tensorboard  --logdir Graph/
Leandro Souza
la source
J'ai AttributeError: 'TensorBoard' object has no attribute 'set_model'.
Fábio Perez
15

Si vous travaillez avec la bibliothèque Keras et que vous souhaitez utiliser tensorboard pour imprimer vos graphiques de précision et d'autres variables, voici les étapes à suivre.

étape 1: initialisez la bibliothèque de rappel de keras pour importer tensorboard en utilisant la commande ci-dessous

from keras.callbacks import TensorBoard

étape 2: Incluez la commande ci-dessous dans votre programme juste avant la commande "model.fit ()".

tensor_board = TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)

Remarque: utilisez "./graph". Il générera le dossier graph dans votre répertoire de travail actuel, évitez d'utiliser "/ graph".

Étape 3: Incluez le rappel Tensorboard dans "model.fit ()". L'exemple est donné ci-dessous.

model.fit(X_train,y_train, batch_size=batch_size, epochs=nb_epoch, verbose=1, validation_split=0.2,callbacks=[tensor_board])

étape 4: exécutez votre code et vérifiez si votre dossier graphique est présent dans votre répertoire de travail. si les codes ci-dessus fonctionnent correctement, vous aurez le dossier "Graph" dans votre répertoire de travail.

étape 5: Ouvrez Terminal dans votre répertoire de travail et tapez la commande ci-dessous.

tensorboard --logdir ./Graph

Étape 6: Ouvrez maintenant votre navigateur Web et entrez l'adresse ci-dessous.

http://localhost:6006

Après avoir entré, la page Tensorbaord s'ouvrira où vous pourrez voir vos graphiques de différentes variables.

Sunil Sharma
la source
Il est important de noter que ce histogram_freq=0paramètre est défini si le tensorboard n'enregistre aucun histogramme par tf.summary.histogram- sinon, il histogram_freqn'est PAS égal à 0!
Agile Bean
9

Voici un code:

K.set_learning_phase(1)
K.set_image_data_format('channels_last')

tb_callback = keras.callbacks.TensorBoard(
    log_dir=log_path,
    histogram_freq=2,
    write_graph=True
)
tb_callback.set_model(model)
callbacks = []
callbacks.append(tb_callback)

# Train net:
history = model.fit(
    [x_train],
    [y_train, y_train_c],
    batch_size=int(hype_space['batch_size']),
    epochs=EPOCHS,
    shuffle=True,
    verbose=1,
    callbacks=callbacks,
    validation_data=([x_test], [y_test, y_test_coarse])
).history

# Test net:
K.set_learning_phase(0)
score = model.evaluate([x_test], [y_test, y_test_coarse], verbose=0)

Fondamentalement, histogram_freq=2c'est le paramètre le plus important à régler lors de l'appel de ce rappel: il définit un intervalle d'époques pour appeler le rappel, dans le but de générer moins de fichiers sur les disques.

Voici donc un exemple de visualisation de l'évolution des valeurs pour la dernière convolution tout au long de l'entraînement une fois vue dans TensorBoard, sous l'onglet "histogrammes" (et j'ai trouvé que l'onglet "distributions" contenait des graphiques très similaires, mais retourné sur le côté):

surveillance des poids du tensorboard

Au cas où vous souhaiteriez voir un exemple complet en contexte, vous pouvez vous référer à ce projet open-source: https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100

Guillaume Chevalier
la source
J'ai voté contre cela parce qu'une grande partie de cela est en fait des questions et non une réponse à la question. Ne posez pas de nouvelles questions dans les réponses, qu'il s'agisse d'une partie ou de tout le but d'une réponse.
Zoe
J'ai édité la question pour supprimer ce que vous avez mentionné. En fait, ce rappel est très difficile à utiliser correctement à partir de la documentation au moment où j'ai répondu.
Guillaume Chevalier
Pour répondre "Comment utiliser le callback TensorBoard de Keras?", Toutes les autres réponses sont incomplètes et ne répondent qu'au petit contexte de la question - personne ne s'attaque aux plongements par exemple. Au moins, j'avais documenté des erreurs potentielles ou des choses à éviter dans ma réponse. Je pense que j'ai soulevé des questions importantes auxquelles personne n'a encore pensé. J'attends toujours une réponse complète. Ce rappel est également mal documenté, comme le cancer.
Guillaume Chevalier
4

Si vous utilisez google-colab, une simple visualisation du graphique serait:

import tensorboardcolab as tb

tbc = tb.TensorBoardColab()
tensorboard = tb.TensorBoardColabCallback(tbc)


history = model.fit(x_train,# Features
                    y_train, # Target vector
                    batch_size=batch_size, # Number of observations per batch
                    epochs=epochs, # Number of epochs
                    callbacks=[early_stopping, tensorboard], # Early stopping
                    verbose=1, # Print description after each epoch
                    validation_split=0.2, #used for validation set every each epoch
                    validation_data=(x_test, y_test)) # Test data-set to evaluate the model in the end of training
DINA TAKLIT
la source
2

Vous avez écrit log_dir='/Graph'à la ./Graphplace? Vous l'avez envoyé à /home/user/Graphpour le moment.

Partie
la source
1
Pourquoi /Graphcréerait un dossier dans le répertoire personnel de l'utilisateur au lieu de simplement l'utiliser /Graphdirectement?
Michael Mior
2

Vous devriez vérifier Losswise ( https://losswise.com ), il a un plugin pour Keras qui est plus facile à utiliser que Tensorboard et a quelques fonctionnalités supplémentaires intéressantes. Avec Losswise, vous utiliseriez simplement from losswise.libs import LosswiseKerasCallbacket ensuite callback = LosswiseKerasCallback(tag='my fancy convnet 1')et vous êtes prêt à partir (voir https://docs.losswise.com/#keras-plugin ).

Nicodjimenez
la source
7
Avertissement: OP est le fondateur de Losswise, qui est un produit payant (bien qu'avec un niveau gratuit assez généreux)
Michael Mior
@MichaelMior a raison, bien que ce ne soit pas encore un produit payant et ne le sera peut-être jamais (à part les licences sur site dans le futur peut-être)
nicodjimenez
2

Il y a peu de choses.

D'abord, pas /Graphmais./Graph

Deuxièmement, lorsque vous utilisez le rappel TensorBoard, transmettez toujours les données de validation, car sans elles, cela ne démarrerait pas.

Troisièmement, si vous souhaitez utiliser autre chose que des résumés scalaires, vous ne devez utiliser que la fitméthode car fit_generatorelle ne fonctionnera pas. Ou vous pouvez réécrire le rappel pour travailler avec fit_generator.

Pour ajouter des rappels, ajoutez-le simplement à model.fit(..., callbacks=your_list_of_callbacks)

Andrey Nikishaev
la source
Lien connexe au 3e point: github.com/keras-team/keras/issues/3358#issuecomment-312531958
Leo Brueggeman
2

Créez le rappel Tensorboard:

from keras.callbacks import TensorBoard
from datetime import datetime
logDir = "./Graph/" + datetime.now().strftime("%Y%m%d-%H%M%S") + "/"
tb = TensorBoard(log_dir=logDir, histogram_freq=2, write_graph=True, write_images=True, write_grads=True)

Transmettez le rappel Tensorboard à l'appel d'ajustement:

history = model.fit(X_train, y_train, epochs=200, callbacks=[tb])

Lors de l'exécution du modèle, si vous obtenez une erreur Keras de

"Vous devez fournir une valeur pour le tenseur d'espace réservé"

essayez de réinitialiser la session Keras avant la création du modèle en faisant:

import keras.backend as K
K.clear_session()
rsc
la source
Il fixe la question, You must feed a value for placeholder tensor. Une idée pourquoi?
Ruthvik Vaila