¿Cómo uso la devolución de llamada de Tensorboard de Keras?

143

He construido una red neuronal con Keras. Visualizaría sus datos por Tensorboard, por lo tanto, he utilizado:

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

como se explica en keras.io . Cuando ejecuto la devolución de llamada obtengo <keras.callbacks.TensorBoard at 0x7f9abb3898>, pero no obtengo ningún archivo en mi carpeta "Graph". ¿Hay algo mal en cómo he usado esta devolución de llamada?

Simone
fuente
3
Sugeriría configurar histogram_freqa 1. "histogram_freq: frecuencia (en épocas) en la que se calculan los histogramas de activación para las capas del modelo. Si se establece en 0, los histogramas no se calcularán".
Matt Kleinsmith
10
Tenga cuidado: "/ Graph" crea un directorio en el directorio raíz, mientras que "./Graph" crea uno en el directorio de trabajo.
Matt Kleinsmith
@MattKleinsmith Si se establece en 0, solo los histogramas de activación y ponderación para las capas del modelo no se computarán a través de los datos de Validación, las métricas aún se registrarán.
BugKiller
Creo que es mejor dar un nombre único a la mirada de logdir en stackoverflow.com/a/54949146/1179925
mrgloom el

Respuestas:

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

Esta línea crea un objeto de Tensorboard de devolución de llamada, debe capturar ese objeto y asignarlo a la fitfunción de su modelo.

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

De esta manera le dio su objeto de devolución de llamada a la función. Se ejecutará durante el entrenamiento y generará archivos que se pueden usar con el tensorboard.

Si desea visualizar los archivos creados durante el entrenamiento, ejecute en su terminal

tensorboard --logdir path_to_current_dir/Graph 

Espero que esto ayude !

Nassim Ben
fuente
Usé esto con el siguiente error cuando write_images = False
abdul qayyum
InvalidArgumentError (ver arriba para rastreo): el tensor debe ser 4-D con el último dim 1, 3 o 4, no [1,3,3,256,256,1] [[Nodo: conv_3.2_2 / kernel_0_1 = ImageSummary [T = DT_FLOAT, bad_color = Tensor <tipo: uint8 forma: [4] valores: 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
¿Y algo que dice que falta marcador de posición dtype = float cuando True Any Idea?
abdul qayyum
2
La pestaña Escalares todavía está vacía, aunque puedo ver la arquitectura de mi modelo en la pestaña Gráficos.
iratzhash
1
esto solo produce escalares para la pérdida y precisión del entrenamiento. ¿Cómo haces lo mismo para validation_data que se pasa a la función de ajuste?
Utku Ufuk
46

Así es como se usa la devolución de llamada 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
fuente
2
¿Hay alguna manera de estructurar mejor la salida del tablero de sensores? ¿Keras hace alguna optimización al respecto?
Nickpick
2
@nickpick No sé a qué te refieres. Pero creo que esto podría ser un candidato para otra pregunta.
Martin Thoma
Es importante tener en cuenta que histogram_freq=0se establece si el tensorboard no registra ningún histograma tf.summary.histogram; de lo contrario histogram_freq, NO es igual a 0.
Agile Bean
20

Cambio

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

a

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

y configura tu modelo

tbCallback.set_model(model)

Corre en tu terminal

tensorboard  --logdir Graph/
Leandro Souza
fuente
Llegué AttributeError: 'TensorBoard' object has no attribute 'set_model'.
Fábio Perez
15

Si está trabajando con la biblioteca Keras y desea utilizar el tensorboard para imprimir sus gráficos de precisión y otras variables, a continuación se detallan los pasos a seguir.

Paso 1: Inicialice la biblioteca de devolución de llamada de Keras para importar el tensorboard mediante el siguiente comando

from keras.callbacks import TensorBoard

Paso 2: incluye el siguiente comando en tu programa justo antes del comando "model.fit ()".

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

Nota: Use "./graph". Generará la carpeta de gráficos en su directorio de trabajo actual, evite usar "/ graph".

Paso 3: Incluir la devolución de llamada de Tensorboard en "model.fit ()". El ejemplo se muestra a continuación.

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

Paso 4: Ejecute su código y verifique si su carpeta de gráficos está allí en su directorio de trabajo. si los códigos anteriores funcionan correctamente, tendrá la carpeta "Graph" en su directorio de trabajo.

Paso 5: Abra la Terminal en su directorio de trabajo y escriba el comando a continuación.

tensorboard --logdir ./Graph

Paso 6: Ahora abre tu navegador web e ingresa la dirección a continuación.

http://localhost:6006

Después de ingresar, se abrirá la página Tensorbaord donde podrá ver sus gráficos de diferentes variables.

Sunil Sharma
fuente
Es importante tener en cuenta que histogram_freq=0se establece si el tensorboard no registra ningún histograma tf.summary.histogram; de lo contrario histogram_freq, NO es igual a 0.
Agile Bean
9

Aquí hay un código:

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)

Básicamente, histogram_freq=2es el parámetro más importante para sintonizar al llamar a esta devolución de llamada: establece un intervalo de épocas para llamar a la devolución de llamada, con el objetivo de generar menos archivos en los discos.

Así que aquí hay un ejemplo de visualización de la evolución de los valores para la última convolución durante el entrenamiento, una vez visto en TensorBoard, debajo de la pestaña "histogramas" (y encontré que la pestaña "distribuciones" contiene gráficos muy similares, pero volteados al costado):

monitorización de pesas de tensorboard

En caso de que desee ver un ejemplo completo en contexto, puede consultar este proyecto de código abierto: https://github.com/Vooban/Hyperopt-Keras-CNN-CIFAR-100

Guillaume Chevalier
fuente
Voté en contra de esto porque una gran parte de esto son en realidad preguntas y no una respuesta a la pregunta. No haga nuevas preguntas en las respuestas, ya sea una parte o el propósito completo de una respuesta.
Zoe
Edité la pregunta para eliminar lo que mencionaste. De hecho, esta devolución de llamada es muy difícil de usar correctamente de la documentación en el momento en que respondí.
Guillaume Chevalier
Para responder "¿Cómo utilizo la devolución de llamada TensorBoard de Keras?", Todas las demás respuestas están incompletas y responden solo al pequeño contexto de la pregunta: nadie aborda las incrustaciones, por ejemplo. Al menos, había documentado posibles errores o cosas para evitar en mi respuesta. Creo que planteé preguntas importantes en las que nadie considera siquiera pensar todavía. Todavía estoy esperando una respuesta completa. Esta devolución de llamada también está mal documentada, como el cáncer.
Guillaume Chevalier
4

Si está utilizando google-colab, la visualización simple del gráfico sería:

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
fuente
2

Escribiste log_dir='/Graph', ¿querías decir en su ./Graphlugar? Lo enviaste /home/user/Graphen este momento.

Parte
fuente
1
¿Por qué /Graphcrear una carpeta en el directorio de inicio del usuario en lugar de usarla /Graphdirectamente?
Michael Mior
2

Debe consultar Losswise ( https://losswise.com ), tiene un complemento para Keras que es más fácil de usar que Tensorboard y tiene algunas características adicionales agradables. Con Losswise solo usarías from losswise.libs import LosswiseKerasCallbacky luego callback = LosswiseKerasCallback(tag='my fancy convnet 1')estarás listo (ver https://docs.losswise.com/#keras-plugin ).

nicodjimenez
fuente
77
Descargo de responsabilidad: OP es el fundador de Losswise, que es un producto pago (aunque con un nivel gratuito bastante generoso)
Michael Mior
@MichaelMior es correcto, aunque todavía no es un producto pago y puede que nunca lo sea (aparte de las licencias premier en el futuro, tal vez)
nicodjimenez
2

Hay pocas cosas

Primero no /Graphpero./Graph

En segundo lugar, cuando usa la devolución de llamada TensorBoard, siempre pase los datos de validación, porque sin ella, no comenzaría.

En tercer lugar, si desea usar cualquier cosa excepto resúmenes escalares, entonces solo debe usar el fitmétodo porque fit_generatorno funcionará. O puede reescribir la devolución de llamada para trabajar fit_generator.

Para agregar devoluciones de llamada, solo agréguela a model.fit(..., callbacks=your_list_of_callbacks)

Andrey Nikishaev
fuente
Enlace relacionado sobre el tercer punto: github.com/keras-team/keras/issues/3358#issuecomment-312531958
Leo Brueggeman
2

Cree la devolución de llamada de 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)

Pase la devolución de llamada de Tensorboard a la llamada de ajuste:

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

Al ejecutar el modelo, si obtiene un error de Keras de

"Debe alimentar un valor para el tensor de marcador de posición"

intente restablecer la sesión de Keras antes de la creación del modelo haciendo:

import keras.backend as K
K.clear_session()
rsc
fuente
Se ha solucionado el problema, You must feed a value for placeholder tensor. ¿Alguna idea de por qué?
Ruthvik Vaila