¿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?


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 !


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])

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/

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.


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


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

2

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


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 ).


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)



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()

Se ha solucionado el problema, You must feed a value for placeholder tensor. ¿Alguna idea de por qué?
Ruthvik Vaila
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.