TensorBoard es un conjunto de aplicaciones web para inspeccionar y comprender sus ejecuciones y gráficos de TensorFlow.
Este README ofrece una descripción general de los conceptos clave de TensorBoard, así como también cómo interpretar las visualizaciones que proporciona TensorBoard. Para ver un ejemplo detallado del uso de TensorBoard, consulte el tutorial: TensorBoard: Getting Started. La documentación sobre cómo usar TensorBoard para trabajar con imágenes, gráficos, hiperparámetros y más está vinculada desde allí, junto con tutoriales en Colab.
TensorBoard está diseñado para funcionar completamente sin conexión, sin necesidad de acceso a Internet. Por ejemplo, esto puede estar en su máquina local, detrás de un firewall corporativo o en un centro de datos.
Antes de ejecutar TensorBoard, asegúrese de haber generado datos de resumen en un directorio de registro mediante la creación de un redactor de resumen:
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
Para obtener más detalles, consulte el tutorial de TensorBoard. Una vez que tenga los archivos de eventos, ejecute TensorBoard y proporcione el directorio de registro. Si está utilizando un paquete TensorFlow precompilado (por ejemplo, lo instaló mediante pip), ejecute:
tensorboard --logdir path/to/logs
O, si está compilando desde la fuente:
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
Esto debería imprimir que TensorBoard se ha iniciado. A continuación, conéctese a http://localhost:6006.
TensorBoard requiere un logdir
para leer los registros. Para obtener información sobre cómo configurar TensorBoard, ejecute tensorboard --help
.
TensorBoard se puede utilizar en Google Chrome o Firefox. Es posible que otros navegadores funcionen, pero puede haber errores o problemas de rendimiento.
El primer paso para usar TensorBoard es adquirir datos de su ejecución de TensorFlow. Para ello, necesita operaciones resumidas. Las operaciones de resumen son operaciones, al igual que tf.matmul
y tf.nn.relu
, lo que significa que toman tensores, producen tensores y se evalúan desde un gráfico de TensorFlow. Sin embargo, las operaciones resumidas tienen un giro: los tensores que producen contienen protobufs serializados, que se escriben en el disco y se envían a TensorBoard. Para visualizar los datos resumidos en TensorBoard, debe evaluar la operación de resumen, recuperar el resultado y luego escribir ese resultado en el disco usando un resumen.FileWriter. Una explicación completa, con ejemplos, está en el tutorial.
Las operaciones de resumen admitidas incluyen:
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
Cuando hagas una operación resumida, también le darás una tag
. La etiqueta es básicamente un nombre para los datos registrados por esa operación y se utilizará para organizar los datos en la interfaz. Los paneles escalar e histograma organizan los datos por etiqueta y agrupan las etiquetas en carpetas según un directorio/me gusta/jerarquía. Si tiene muchas etiquetas, le recomendamos agruparlas con barras.
summary.FileWriters
toman datos resumidos de TensorFlow y luego los escriben en un directorio específico, conocido como logdir
. Específicamente, los datos se escriben en un volcado de registros de solo anexar que tendrá "tfevents" en el nombre del archivo. TensorBoard lee datos de un directorio completo y los organiza en el historial de una única ejecución de TensorFlow.
¿Por qué lee todo el directorio, en lugar de un archivo individual? Es posible que haya estado usando supervisor.py para ejecutar su modelo, en cuyo caso, si TensorFlow falla, el supervisor lo reiniciará desde un punto de control. Cuando se reinicie, comenzará a escribir en un nuevo archivo de eventos y TensorBoard unirá los distintos archivos de eventos para producir un historial coherente de lo que sucedió.
Es posible que desee comparar visualmente varias ejecuciones de su modelo; por ejemplo, supongamos que ha cambiado los hiperparámetros y desea ver si convergen más rápido. TensorBoard permite esto a través de diferentes "ejecuciones". Cuando a TensorBoard se le pasa un logdir
al inicio, recorre de forma recursiva el árbol de directorios con raíz en logdir
en busca de subdirectorios que contengan datos de tfevents. Cada vez que encuentra un subdirectorio de este tipo, lo carga como una nueva run
y la interfaz organizará los datos en consecuencia.
Por ejemplo, aquí hay un directorio de registro de TensorBoard bien organizado, con dos ejecuciones, "run1" y "run2".
/some/path/mnist_experiments/
/some/path/mnist_experiments/run1/
/some/path/mnist_experiments/run1/events.out.tfevents.1456525581.name
/some/path/mnist_experiments/run1/events.out.tfevents.1456525585.name
/some/path/mnist_experiments/run2/
/some/path/mnist_experiments/run2/events.out.tfevents.1456525385.name
/tensorboard --logdir /some/path/mnist_experiments
También puede pasar una lista de directorios de registro separados por comas y TensorBoard observará cada directorio. También puede asignar nombres a directorios de registros individuales colocando dos puntos entre el nombre y la ruta, como en
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
Esta bandera ( --logdir_spec
) no se recomienda y generalmente se puede evitar . TensorBoard recorre los directorios de registros de forma recursiva; para un control más detallado, prefiera utilizar un árbol de enlaces simbólicos. Es posible que algunas funciones no funcionen cuando se usa --logdir_spec
en lugar de --logdir
.
El Scalar Dashboard de TensorBoard visualiza estadísticas escalares que varían con el tiempo; por ejemplo, es posible que desee realizar un seguimiento de la tasa de pérdida o aprendizaje del modelo. Como se describe en Conceptos clave , puede comparar varias ejecuciones y los datos se organizan por etiqueta. Los gráficos de líneas tienen las siguientes interacciones:
Al hacer clic en el pequeño icono azul en la esquina inferior izquierda de cada gráfico, se expandirá el gráfico.
Arrastrar una región rectangular en el gráfico hará zoom
Al hacer doble clic en el gráfico se alejará
Al pasar el mouse sobre el gráfico, aparecerá una mira, con los valores de datos registrados en el selector de ejecución a la izquierda.
Además, puede crear nuevas carpetas para organizar etiquetas escribiendo expresiones regulares en el cuadro en la parte superior izquierda del panel.
El panel de histograma muestra cómo la distribución estadística de un tensor ha variado con el tiempo. Visualiza los datos registrados a través de tf.summary.histogram
. Cada gráfico muestra "porciones" temporales de datos, donde cada porción es un histograma del tensor en un paso determinado. Está organizado con el paso de tiempo más antiguo detrás y el paso de tiempo más reciente al frente. Al cambiar el modo de histograma de "desplazamiento" a "superposición", la perspectiva rotará de modo que cada segmento del histograma se represente como una línea y se superponga entre sí.
El Panel de distribución es otra forma de visualizar datos de histograma de tf.summary.histogram
. Muestra algunas estadísticas de alto nivel sobre una distribución. Cada línea del gráfico representa un percentil en la distribución de los datos: por ejemplo, la línea inferior muestra cómo ha cambiado el valor mínimo con el tiempo y la línea del medio muestra cómo ha cambiado la mediana. Leídas de arriba a abajo, las líneas tienen el siguiente significado: [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
Estos percentiles también pueden verse como límites de desviación estándar en una distribución normal: [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
de modo que las regiones coloreadas, leídas de adentro hacia afuera, tengan anchos [σ, 2σ, 3σ]
respectivamente.
El Panel de imágenes puede mostrar archivos png que se guardaron mediante tf.summary.image
. El panel está configurado para que cada fila corresponda a una etiqueta diferente y cada columna corresponda a una ejecución. Dado que el panel de imágenes admite archivos png arbitrarios, puede usarlo para incrustar visualizaciones personalizadas (por ejemplo, diagramas de dispersión matplotlib) en TensorBoard. Este panel siempre le muestra la imagen más reciente para cada etiqueta.
El Panel de audio puede incorporar widgets de audio reproducibles para el audio guardado a través de tf.summary.audio
. El panel está configurado para que cada fila corresponda a una etiqueta diferente y cada columna corresponda a una ejecución. Este panel siempre incorpora el audio más reciente para cada etiqueta.
Graph Explorer puede visualizar un gráfico de TensorBoard, lo que permite inspeccionar el modelo de TensorFlow. Para aprovechar al máximo el visualizador de gráficos, debe utilizar ámbitos de nombres para agrupar jerárquicamente las operaciones en su gráfico; de lo contrario, el gráfico puede ser difícil de descifrar. Para obtener más información, incluidos ejemplos, consulte el tutorial sobre cómo examinar el gráfico de TensorFlow.
El proyector integrado le permite visualizar datos de alta dimensión; por ejemplo, puede ver los datos de entrada después de que su modelo los haya incrustado en un espacio de alta dimensión. El proyector integrado lee datos del archivo de punto de control de su modelo y puede configurarse con metadatos adicionales, como un archivo de vocabulario o imágenes de sprites. Para obtener más detalles, consulte el tutorial de integración del proyector.
El panel de texto muestra fragmentos de texto guardados mediante tf.summary.text
. Se admiten todas las funciones de Markdown, incluidos hipervínculos, listas y tablas.
El panel de series temporales muestra una interfaz unificada que contiene todos los escalares, histogramas e imágenes guardados mediante tf.summary.scalar
, tf.summary.image
o tf.summary.histogram
. Permite ver su gráfico de líneas de "precisión" al lado de histogramas de activación e imágenes de ejemplo de entrenamiento, por ejemplo.
Las características incluyen:
Colores de ejecución personalizados: haga clic en los círculos de colores en el selector de ejecución para cambiar el color de una ejecución.
Tarjetas fijadas: haga clic en el ícono 'fijar' en cualquier tarjeta para agregarla a la sección fijada en la parte superior para una comparación rápida.
Configuración: el panel derecho ofrece configuraciones para gráficos y otras visualizaciones. Las configuraciones importantes persistirán en todas las sesiones de TensorBoard, cuando se alojen en el mismo origen de URL.
Autocompletar en filtro de etiquetas: busque gráficos específicos más fácilmente.
Primero, verifique que el directorio pasado a --logdir
sea correcto. También puede verificar esto navegando al panel de Scalars (en el menú "Inactivo") y buscando la ruta del directorio de registro en la parte inferior de la barra lateral izquierda.
Si está cargando desde la ruta adecuada, asegúrese de que los archivos de eventos estén presentes. TensorBoard recorrerá recursivamente su logdir, está bien si los datos están anidados en un subdirectorio. Asegúrese de que lo siguiente muestre al menos un resultado:
find DIRECTORY_PATH | grep tfevents
También puede verificar que los archivos de eventos realmente tengan datos ejecutando tensorboard en modo de inspección para inspeccionar el contenido de sus archivos de eventos.
tensorboard --inspect --logdir DIRECTORY_PATH
La salida de un archivo de eventos correspondiente a un TensorBoard en blanco a veces aún puede mostrar algunos pasos, que representan algunos eventos iniciales que TensorBoard no muestra (por ejemplo, cuando se usa la devolución de llamada de Keras TensorBoard):
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
Por el contrario, la salida de un archivo de evento con más datos podría verse así:
tensor
first_step 0
last_step 55
max_step 250
min_step 0
num_steps 60
outoforder_steps [(2, 0), (2, 0), (2, 0), (2, 0), (50, 9), (100, 19), (150, 29), (200, 39), (250, 49)]
Actualización: después del lanzamiento 2.3.0, TensorBoard ya no se recarga automáticamente cada 30 segundos. Para volver a habilitar el comportamiento, abra la configuración haciendo clic en el ícono de ajustes en la parte superior derecha de la interfaz web de TensorBoard y habilite "Recargar datos".
Actualización: la opción experimental
--reload_multifile=true
ahora se puede usar para sondear todos los archivos "activos" en un directorio en busca de nuevos datos, en lugar del más reciente como se describe a continuación. Un archivo está "activo" siempre que haya recibido datos nuevos hace--reload_multifile_inactive_secs
segundos, con un valor predeterminado de 86400.
Este problema generalmente surge debido a la forma en que TensorBoard itera a través de los archivos tfevents
: avanza a través del archivo de eventos en orden de marca de tiempo y solo lee un archivo a la vez. Supongamos que tenemos archivos con marcas de tiempo a
y b
, donde a . Una vez que TensorBoard haya leído todos los eventos en
a
, nunca volverá a él, porque supone que los eventos nuevos se están escribiendo en el archivo más reciente. Esto podría causar un problema si, por ejemplo, tiene dos FileWriters
escribiendo simultáneamente en el mismo directorio. Si tiene varios redactores de resúmenes, cada uno debe escribir en un directorio separado.
Actualización: la opción experimental
--reload_multifile=true
ahora se puede usar para sondear todos los archivos "activos" en un directorio en busca de datos nuevos, definidos como cualquier archivo que recibió datos nuevos hace--reload_multifile_inactive_secs
segundos, con un valor predeterminado de 86400.
No. TensorBoard espera que solo se escriba en un archivo de eventos a la vez, y varios redactores de resúmenes significan varios archivos de eventos. Si está ejecutando una instancia distribuida de TensorFlow, le recomendamos que designe a un único trabajador como "jefe" responsable de todo el procesamiento del resumen. Consulte supervisor.py para ver un ejemplo.
Si ve datos que parecen viajar hacia atrás en el tiempo y superponerse consigo mismos, existen algunas explicaciones posibles.
Es posible que tenga varias ejecuciones de TensorFlow y todas escribieran en el mismo directorio de registro. Haga que cada ejecución de TensorFlow escriba en su propio directorio de registro.
Actualización: la opción experimental
--reload_multifile=true
ahora se puede usar para sondear todos los archivos "activos" en un directorio en busca de datos nuevos, definidos como cualquier archivo que recibió datos nuevos hace--reload_multifile_inactive_secs
segundos, con un valor predeterminado de 86400.
Es posible que tenga un error en su código donde la variable global_step (pasada a FileWriter.add_summary
) se mantiene incorrectamente.
Es posible que su trabajo de TensorFlow fallara y se reiniciara desde un punto de control anterior. Consulte Cómo manejar los reinicios de TensorFlow a continuación.
Como solución alternativa, intente cambiar la visualización del eje x en TensorBoard de steps
a wall_time
. Esto frecuentemente aclarará el problema.
TensorFlow está diseñado con un mecanismo para una recuperación elegante si un trabajo falla o se cancela: TensorFlow puede escribir periódicamente archivos de puntos de control del modelo, lo que le permite reiniciar TensorFlow sin perder todo su progreso de entrenamiento.
Sin embargo, esto puede complicar las cosas para TensorBoard; Imagine que TensorFlow escribió un punto de control en el paso a
y luego continuó ejecutándose hasta el paso b
, y luego falló y se reinició en la marca de tiempo a
. Todos los eventos escritos entre a
y b
quedaron "huérfanos" por el evento de reinicio y deben eliminarse.
Para facilitar esto, tenemos un mensaje SessionLog
en tensorflow/core/util/event.proto
que puede registrar SessionStatus.START
como un evento; Como todo evento, puede tener un step
asociado. Si TensorBoard detecta un evento SessionStatus.START
con el paso a
, asumirá que cada evento con un paso mayor que a
quedó huérfano y descartará esos eventos. Este comportamiento se puede desactivar con el indicador --purge_orphaned_data false
(en versiones posteriores a la 0.7).
Scalar Dashboard admite la exportación de datos; puede hacer clic en la opción "habilitar enlaces de descarga" en la barra de la izquierda. Luego, cada gráfico proporcionará enlaces de descarga para los datos que contiene.
Si necesita acceder al conjunto de datos completo, puede leer los archivos de eventos que consume TensorBoard utilizando el método summary_iterator
.
¡Sí! Puedes clonar y modificar uno de los ejemplos y crear tus propias visualizaciones sorprendentes. Se describe más documentación sobre el sistema de complementos en la guía ADDING_A_PLUGIN. No dude en presentar solicitudes de funciones o preguntas sobre la funcionalidad del complemento.
Una vez que esté satisfecho con su nuevo e innovador complemento, consulte la sección de distribución sobre cómo publicar en PyPI y compartirlo con la comunidad.
Con el complemento de escalares personalizados, puede crear gráficos escalares con líneas para pares de etiquetas de ejecución personalizados. Sin embargo, dentro del panel de escalares original, cada gráfico escalar corresponde a datos de una etiqueta específica y contiene líneas para cada ejecución que incluye esa etiqueta.
Los gráficos de márgenes (que visualizan los límites superior e inferior) se pueden crear con el complemento de escalares personalizados. El complemento de escalares original no admite la visualización de márgenes.
Esto todavía no es posible. Como solución alternativa, puede crear su gráfico personalizado en su propio código (por ejemplo, matplotlib) y luego escribirlo en un SummaryProto
( core/framework/summary.proto
) y agregarlo a su FileWriter
. Luego, su trazado personalizado aparecerá en la pestaña de imagen de TensorBoard.
TensorBoard utiliza muestreo de depósito para reducir la muestra de sus datos y poder cargarlos en la RAM. Puede modificar la cantidad de elementos que mantendrá por etiqueta utilizando el argumento de línea de comando --samples_per_plugin
(por ejemplo: --samples_per_plugin=scalars=500,images=20
). Consulte esta pregunta de Stack Overflow para obtener más información.
Las versiones de TensorBoard anteriores a TensorBoard 2.0 se publicarían de forma predeterminada en el host 0.0.0.0
, al que se puede acceder públicamente. Para esas versiones de TensorBoard, puede detener las ventanas emergentes especificando --host localhost
al inicio.
En TensorBoard 2.0 y versiones posteriores, --host localhost
es el valor predeterminado. Utilice --bind_all
para restaurar el comportamiento anterior de servir a la red pública tanto en IPv4 como en IPv6.
tensorboard
sin una instalación de TensorFlow?TensorBoard 1.14+ se puede ejecutar con un conjunto de funciones reducido si no tiene TensorFlow instalado. La principal limitación es que a partir de la versión 1.14, solo se admiten los siguientes complementos: escalares, escalares personalizados, imagen, audio, gráfico, proyector (parcial), distribuciones, histogramas, texto, curvas PR, malla. Además, no hay soporte para directorios de registros en Google Cloud Storage.
Ver DESARROLLO.md.
Primero, intente buscar nuestros problemas de GitHub y Stack Overflow. Puede ser que alguien más ya haya tenido el mismo problema o pregunta.
Las preguntas de uso general (o problemas que pueden ser específicos de su configuración local) deben dirigirse a Stack Overflow.
Si encontró un error en TensorBoard, presente un problema de GitHub con tanta información de respaldo como pueda proporcionar (por ejemplo, adjuntando archivos de eventos, incluida la salida de tensorboard --inspect
, etc.).