TensorBoard ist eine Suite von Webanwendungen zum Überprüfen und Verstehen Ihrer TensorFlow-Läufe und -Diagramme.
Diese README-Datei bietet einen Überblick über die wichtigsten Konzepte in TensorBoard sowie die Interpretation der von TensorBoard bereitgestellten Visualisierungen. Ein ausführliches Beispiel für die Verwendung von TensorBoard finden Sie im Tutorial: TensorBoard: Erste Schritte. Von dort aus sind Dokumentationen zur Verwendung von TensorBoard zum Arbeiten mit Bildern, Diagrammen, Hyperparametern und mehr sowie Tutorial-Anleitungen in Colab verlinkt.
TensorBoard ist so konzipiert, dass es vollständig offline ausgeführt werden kann, ohne dass ein Zugriff auf das Internet erforderlich ist. Dies kann beispielsweise auf Ihrem lokalen Computer, hinter einer Unternehmens-Firewall oder in einem Rechenzentrum erfolgen.
Stellen Sie vor dem Ausführen von TensorBoard sicher, dass Sie Zusammenfassungsdaten in einem Protokollverzeichnis generiert haben, indem Sie einen Zusammenfassungsschreiber erstellen:
# sess.graph contains the graph definition; that enables the Graph Visualizer.
file_writer = tf . summary . FileWriter ( '/path/to/logs' , sess . graph )
Weitere Informationen finden Sie im TensorBoard-Tutorial. Sobald Sie Ereignisdateien haben, führen Sie TensorBoard aus und geben Sie das Protokollverzeichnis an. Wenn Sie ein vorkompiliertes TensorFlow-Paket verwenden (z. B. über pip installiert haben), führen Sie Folgendes aus:
tensorboard --logdir path/to/logs
Oder, wenn Sie aus dem Quellcode erstellen:
bazel build tensorboard:tensorboard
./bazel-bin/tensorboard/tensorboard --logdir path/to/logs
# or even more succinctly
bazel run tensorboard -- --logdir path/to/logs
Es sollte gedruckt werden, dass TensorBoard gestartet wurde. Stellen Sie als Nächstes eine Verbindung zu http://localhost:6006 her.
TensorBoard benötigt ein logdir
zum Lesen von Protokollen. Für Informationen zur Konfiguration von TensorBoard führen Sie tensorboard --help
aus.
TensorBoard kann in Google Chrome oder Firefox verwendet werden. Andere Browser funktionieren möglicherweise, es können jedoch Fehler oder Leistungsprobleme auftreten.
Der erste Schritt bei der Verwendung von TensorBoard ist die Erfassung von Daten aus Ihrem TensorFlow-Lauf. Hierfür benötigen Sie eine zusammenfassende Operation. Zusammenfassende Operationen sind Operationen, genau wie tf.matmul
und tf.nn.relu
, was bedeutet, dass sie Tensoren aufnehmen, Tensoren erzeugen und innerhalb eines TensorFlow-Diagramms ausgewertet werden. Zusammenfassungsoperationen haben jedoch eine Besonderheit: Die von ihnen erzeugten Tensoren enthalten serialisierte Protobufs, die auf die Festplatte geschrieben und an TensorBoard gesendet werden. Um die Zusammenfassungsdaten in TensorBoard zu visualisieren, sollten Sie die Zusammenfassungsoperation auswerten, das Ergebnis abrufen und dieses Ergebnis dann mit einem summary.FileWriter auf die Festplatte schreiben. Eine ausführliche Erklärung mit Beispielen finden Sie im Tutorial.
Zu den unterstützten Zusammenfassungsoperationen gehören:
tf.summary.scalar
tf.summary.image
tf.summary.audio
tf.summary.text
tf.summary.histogram
Wenn Sie eine zusammenfassende Operation erstellen, geben Sie ihr auch ein tag
. Das Tag ist im Grunde ein Name für die von diesem Vorgang aufgezeichneten Daten und wird zum Organisieren der Daten im Frontend verwendet. Die Skalar- und Histogramm-Dashboards organisieren Daten nach Tags und gruppieren die Tags in Ordnern entsprechend einem Verzeichnis/einer Art/Hierarchie. Wenn Sie viele Tags haben, empfehlen wir, diese mit Schrägstrichen zu gruppieren.
summary.FileWriters
übernehmen Zusammenfassungsdaten von TensorFlow und schreiben sie dann in ein angegebenes Verzeichnis, das als logdir
bezeichnet wird. Konkret werden die Daten in einen Nur-Anhang-Datensatz-Dump geschrieben, dessen Dateiname „tfevents“ enthält. TensorBoard liest Daten aus einem vollständigen Verzeichnis und organisiert sie im Verlauf einer einzelnen TensorFlow-Ausführung.
Warum liest es das gesamte Verzeichnis und nicht eine einzelne Datei? Möglicherweise haben Sie supervisor.py zum Ausführen Ihres Modells verwendet. Wenn TensorFlow in diesem Fall abstürzt, wird es vom Supervisor von einem Prüfpunkt aus neu gestartet. Beim Neustart beginnt es, in eine neue Ereignisdatei zu schreiben, und TensorBoard fügt die verschiedenen Ereignisdateien zusammen, um einen konsistenten Verlauf der Ereignisse zu erstellen.
Möglicherweise möchten Sie mehrere Ausführungen Ihres Modells visuell vergleichen. Angenommen, Sie haben die Hyperparameter geändert und möchten sehen, ob die Konvergenz schneller erfolgt. TensorBoard ermöglicht dies durch verschiedene „Läufe“. Wenn TensorBoard beim Start ein logdir
übergeben wird, durchsucht es rekursiv den Verzeichnisbaum, der im logdir
verwurzelt ist, und sucht nach Unterverzeichnissen, die tfevents-Daten enthalten. Jedes Mal, wenn es auf ein solches Unterverzeichnis trifft, lädt es es als neuen run
und das Frontend organisiert die Daten entsprechend.
Hier ist zum Beispiel ein gut organisiertes TensorBoard-Protokollverzeichnis mit zwei Läufen, „run1“ und „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
Sie können auch eine durch Kommas getrennte Liste von Protokollverzeichnissen übergeben, und TensorBoard überwacht jedes Verzeichnis. Sie können einzelnen Protokollverzeichnissen auch Namen zuweisen, indem Sie einen Doppelpunkt zwischen dem Namen und dem Pfad einfügen, wie in
tensorboard --logdir_spec name1:/path/to/logs/1,name2:/path/to/logs/2
Von diesem Flag ( --logdir_spec
) wird abgeraten und es kann normalerweise vermieden werden . TensorBoard durchsucht Protokollverzeichnisse rekursiv; Für eine detailliertere Steuerung verwenden Sie lieber einen Symlink-Baum. Einige Funktionen funktionieren möglicherweise nicht, wenn --logdir_spec
anstelle von --logdir
verwendet wird.
Das Skalar-Dashboard von TensorBoard visualisiert Skalarstatistiken, die sich im Laufe der Zeit ändern. Beispielsweise möchten Sie möglicherweise den Verlust oder die Lernrate des Modells verfolgen. Wie in Schlüsselkonzepte beschrieben, können Sie mehrere Läufe vergleichen und die Daten werden nach Tags organisiert. Die Liniendiagramme haben folgende Interaktionen:
Durch Klicken auf das kleine blaue Symbol in der unteren linken Ecke jedes Diagramms wird das Diagramm erweitert
Durch Ziehen eines rechteckigen Bereichs im Diagramm wird dieser vergrößert
Durch einen Doppelklick auf das Diagramm wird herausgezoomt
Wenn Sie mit der Maus über das Diagramm fahren, wird ein Fadenkreuz erzeugt, dessen Datenwerte im Laufselektor auf der linken Seite aufgezeichnet werden.
Darüber hinaus können Sie neue Ordner erstellen, um Tags zu organisieren, indem Sie reguläre Ausdrücke in das Feld oben links im Dashboard eingeben.
Das Histogramm-Dashboard zeigt, wie sich die statistische Verteilung eines Tensors im Laufe der Zeit verändert hat. Es visualisiert über tf.summary.histogram
aufgezeichnete Daten. Jedes Diagramm zeigt zeitliche „Slices“ von Daten, wobei jedes Slice ein Histogramm des Tensors in einem bestimmten Schritt ist. Es ist mit dem ältesten Zeitschritt hinten und dem neuesten Zeitschritt vorne organisiert. Wenn Sie den Histogrammmodus von „Offset“ auf „Overlay“ ändern, wird die Perspektive gedreht, sodass jedes Histogrammsegment als Linie gerendert und einander überlagert wird.
Das Distribution Dashboard ist eine weitere Möglichkeit, Histogrammdaten aus tf.summary.histogram
zu visualisieren. Es zeigt einige allgemeine Statistiken zu einer Verteilung. Jede Linie im Diagramm stellt ein Perzentil der Verteilung über die Daten dar: Die untere Zeile zeigt beispielsweise, wie sich der Mindestwert im Laufe der Zeit verändert hat, und die Linie in der Mitte zeigt, wie sich der Median verändert hat. Von oben nach unten gelesen haben die Zeilen folgende Bedeutung: [maximum, 93%, 84%, 69%, 50%, 31%, 16%, 7%, minimum]
Diese Perzentile können auch als Standardabweichungsgrenzen einer Normalverteilung betrachtet werden: [maximum, μ+1.5σ, μ+σ, μ+0.5σ, μ, μ-0.5σ, μ-σ, μ-1.5σ, minimum]
so dass die farbigen Bereiche, von innen nach außen gelesen, jeweils Breiten [σ, 2σ, 3σ]
haben.
Das Bild-Dashboard kann PNGs anzeigen, die über ein tf.summary.image
gespeichert wurden. Das Dashboard ist so eingerichtet, dass jede Zeile einem anderen Tag und jede Spalte einem Lauf entspricht. Da das Bild-Dashboard beliebige PNGs unterstützt, können Sie damit benutzerdefinierte Visualisierungen (z. B. Matplotlib-Streudiagramme) in TensorBoard einbetten. Dieses Dashboard zeigt Ihnen immer das neueste Bild für jedes Tag.
Das Audio-Dashboard kann abspielbare Audio-Widgets für über ein tf.summary.audio
gespeichertes Audio einbetten. Das Dashboard ist so eingerichtet, dass jede Zeile einem anderen Tag und jede Spalte einem Lauf entspricht. Dieses Dashboard bettet immer die neuesten Audiodaten für jedes Tag ein.
Der Graph Explorer kann ein TensorBoard-Diagramm visualisieren und so eine Inspektion des TensorFlow-Modells ermöglichen. Um die Diagrammvisualisierung optimal zu nutzen, sollten Sie Namensbereiche verwenden, um die Operationen in Ihrem Diagramm hierarchisch zu gruppieren. Andernfalls kann es schwierig sein, das Diagramm zu entschlüsseln. Weitere Informationen, einschließlich Beispiele, finden Sie im Tutorial zum Untersuchen des TensorFlow-Diagramms.
Mit dem Embedding-Projektor können Sie hochdimensionale Daten visualisieren. Beispielsweise können Sie Ihre Eingabedaten anzeigen, nachdem sie von Ihrem Modell in einen hochdimensionalen Raum eingebettet wurden. Der einbettende Projektor liest Daten aus Ihrer Modell-Checkpoint-Datei und kann mit zusätzlichen Metadaten wie einer Vokabeldatei oder Sprite-Bildern konfiguriert werden. Weitere Einzelheiten finden Sie im Tutorial zum Einbetten des Projektors.
Das Text-Dashboard zeigt Textausschnitte an, die über tf.summary.text
gespeichert wurden. Markdown-Funktionen wie Hyperlinks, Listen und Tabellen werden alle unterstützt.
Das Zeitreihen-Dashboard zeigt eine einheitliche Oberfläche mit allen Ihren über tf.summary.scalar
, tf.summary.image
oder tf.summary.histogram
gespeicherten Skalaren, Histogrammen und Bildern. Es ermöglicht beispielsweise die Anzeige Ihres „Genauigkeits“-Liniendiagramms neben Aktivierungshistogrammen und Trainingsbeispielbildern.
Zu den Funktionen gehören:
Benutzerdefinierte Lauffarben: Klicken Sie auf die farbigen Kreise in der Laufauswahl, um die Farbe eines Laufs zu ändern.
Angepinnte Karten: Klicken Sie auf einer beliebigen Karte auf das „Pin“-Symbol, um sie zum schnellen Vergleich zum angehefteten Abschnitt oben hinzuzufügen.
Einstellungen: Der rechte Bereich bietet Einstellungen für Diagramme und andere Visualisierungen. Wichtige Einstellungen bleiben über TensorBoard-Sitzungen hinweg bestehen, wenn sie am gleichen URL-Ursprung gehostet werden.
Automatische Vervollständigung im Tag-Filter: Einfachere Suche nach bestimmten Diagrammen.
Überprüfen Sie zunächst, ob das an --logdir
übergebene Verzeichnis korrekt ist. Sie können dies auch überprüfen, indem Sie zum Scalars-Dashboard navigieren (im Menü „Inaktiv“) und unten in der linken Seitenleiste nach dem Protokollverzeichnispfad suchen.
Wenn Sie vom richtigen Pfad laden, stellen Sie sicher, dass Ereignisdateien vorhanden sind. TensorBoard durchläuft sein Protokollverzeichnis rekursiv. Es ist in Ordnung, wenn die Daten in einem Unterverzeichnis verschachtelt sind. Stellen Sie sicher, dass Folgendes mindestens ein Ergebnis anzeigt:
find DIRECTORY_PATH | grep tfevents
Sie können auch überprüfen, ob die Ereignisdateien tatsächlich Daten enthalten, indem Sie tensorboard im Prüfmodus ausführen, um den Inhalt Ihrer Ereignisdateien zu überprüfen.
tensorboard --inspect --logdir DIRECTORY_PATH
Die Ausgabe einer Ereignisdatei, die einem leeren TensorBoard entspricht, zeigt möglicherweise immer noch einige Schritte an, die einige anfängliche Ereignisse darstellen, die von TensorBoard nicht angezeigt werden (z. B. bei Verwendung des Keras TensorBoard-Rückrufs):
tensor
first_step 0
last_step 2
max_step 2
min_step 0
num_steps 2
outoforder_steps [(2, 0), (2, 0), (2, 0)]
Im Gegensatz dazu könnte die Ausgabe für eine Ereignisdatei mit mehr Daten wie folgt aussehen:
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)]
Update: Nach der Veröffentlichung von 2.3.0 wird TensorBoard nicht mehr alle 30 Sekunden automatisch neu geladen. Um das Verhalten wieder zu aktivieren, öffnen Sie bitte die Einstellungen, indem Sie oben rechts in der TensorBoard-Weboberfläche auf das Zahnradsymbol klicken und „Daten neu laden“ aktivieren.
Update: Die experimentelle Option
--reload_multifile=true
kann jetzt verwendet werden, um alle „aktiven“ Dateien in einem Verzeichnis nach neuen Daten abzufragen, und nicht die aktuellste, wie unten beschrieben. Eine Datei ist „aktiv“, solange sie innerhalb von--reload_multifile_inactive_secs
Sekunden neue Daten empfangen hat. Der Standardwert ist 86400.
Dieses Problem entsteht normalerweise dadurch, wie TensorBoard die tfevents
Dateien durchläuft: Es durchläuft die Ereignisdatei in der Zeitstempelreihenfolge und liest jeweils nur eine Datei. Nehmen wir an, wir haben Dateien mit den Zeitstempeln a
und b
, wobei a . Sobald TensorBoard alle Ereignisse in
a
gelesen hat, wird es nie wieder dorthin zurückkehren, da es davon ausgeht, dass alle neuen Ereignisse in die neuere Datei geschrieben werden. Dies könnte zu einem Problem führen, wenn beispielsweise zwei FileWriters
gleichzeitig in dasselbe Verzeichnis schreiben. Wenn Sie mehrere Zusammenfassungsschreiber haben, sollte jeder in ein separates Verzeichnis schreiben.
Update: Die experimentelle Option
--reload_multifile=true
kann jetzt verwendet werden, um alle „aktiven“ Dateien in einem Verzeichnis nach neuen Daten abzufragen, definiert als jede Datei, die innerhalb von--reload_multifile_inactive_secs
Sekunden neue Daten empfangen hat, standardmäßig 86400.
Nein. TensorBoard geht davon aus, dass jeweils nur in eine Ereignisdatei geschrieben wird, und mehrere Zusammenfassungsschreiber bedeuten mehrere Ereignisdateien. Wenn Sie eine verteilte TensorFlow-Instanz ausführen, empfehlen wir Ihnen, einen einzelnen Worker als „Chef“ zu ernennen, der für die gesamte Zusammenfassungsverarbeitung verantwortlich ist. Ein Beispiel finden Sie unter supervisor.py.
Wenn Sie Daten sehen, die rückwärts durch die Zeit zu reisen scheinen und sich mit sich selbst überschneiden, gibt es einige mögliche Erklärungen.
Möglicherweise haben Sie mehrere Ausführungen von TensorFlow, die alle in dasselbe Protokollverzeichnis geschrieben haben. Bitte lassen Sie jede TensorFlow-Ausführung in ihr eigenes Logverzeichnis schreiben.
Update: Die experimentelle Option
--reload_multifile=true
kann jetzt verwendet werden, um alle „aktiven“ Dateien in einem Verzeichnis nach neuen Daten abzufragen, definiert als jede Datei, die innerhalb von--reload_multifile_inactive_secs
Sekunden neue Daten empfangen hat, standardmäßig 86400.
Möglicherweise liegt in Ihrem Code ein Fehler vor, bei dem die Variable global_step (an FileWriter.add_summary
übergeben) falsch verwaltet wird.
Möglicherweise ist Ihr TensorFlow-Job abgestürzt und wurde von einem früheren Prüfpunkt aus neu gestartet. Weitere Informationen finden Sie weiter unten unter Umgang mit TensorFlow-Neustarts .
Versuchen Sie als Workaround, die X-Achsen-Anzeige in TensorBoard von steps
in wall_time
zu ändern. Dadurch wird das Problem häufig behoben.
TensorFlow verfügt über einen Mechanismus für eine ordnungsgemäße Wiederherstellung, wenn ein Job abstürzt oder beendet wird: TensorFlow kann regelmäßig Modellprüfpunktdateien schreiben, die es Ihnen ermöglichen, TensorFlow neu zu starten, ohne Ihren gesamten Trainingsfortschritt zu verlieren.
Dies kann jedoch die Situation für TensorBoard erschweren; Stellen Sie sich vor, dass TensorFlow bei Schritt a
einen Prüfpunkt geschrieben hat und dann bis Schritt b
weiter ausgeführt wurde, dann abstürzte und bei Zeitstempel a
neu startete. Alle zwischen a
und b
geschriebenen Ereignisse wurden durch das Neustartereignis „verwaist“ und sollten entfernt werden.
Um dies zu erleichtern, haben wir eine SessionLog
Nachricht in tensorflow/core/util/event.proto
, die SessionStatus.START
als Ereignis aufzeichnen kann; Wie bei allen Ereignissen kann ein step
damit verbunden sein. Wenn TensorBoard ein SessionStatus.START
Ereignis mit Schritt a
erkennt, geht es davon aus, dass jedes Ereignis mit einem Schritt größer als a
verwaist ist, und verwirft diese Ereignisse. Dieses Verhalten kann mit dem Flag --purge_orphaned_data false
(in Versionen nach 0.7) deaktiviert werden.
Das Scalar Dashboard unterstützt den Export von Daten; Sie können in der linken Leiste auf die Option „Download-Links aktivieren“ klicken. Anschließend stellt jedes Diagramm Download-Links für die darin enthaltenen Daten bereit.
Wenn Sie Zugriff auf den vollständigen Datensatz benötigen, können Sie die von TensorBoard genutzten Ereignisdateien mit der Methode summary_iterator
lesen.
Ja! Sie können eines der Beispiele klonen und damit herumbasteln und Ihre eigenen, erstaunlichen Visualisierungen erstellen. Weitere Dokumentation zum Plugin-System finden Sie im Leitfaden ADDING_A_PLUGIN. Fühlen Sie sich frei, Funktionswünsche oder Fragen zur Plugin-Funktionalität einzureichen.
Wenn Sie mit Ihrem eigenen bahnbrechenden neuen Plugin zufrieden sind, lesen Sie im Abschnitt „Verteilung“ nach, wie Sie es auf PyPI veröffentlichen und mit der Community teilen.
Mit dem benutzerdefinierten Skalar-Plugin können Sie Skalardiagramme mit Linien für benutzerdefinierte Run-Tag-Paare erstellen. Im ursprünglichen Skalar-Dashboard entspricht jedoch jedes Skalardiagramm den Daten für ein bestimmtes Tag und enthält Linien für jeden Lauf, der dieses Tag enthält.
Randdiagramme (die die unteren und oberen Grenzen visualisieren) können mit dem benutzerdefinierten Skalar-Plugin erstellt werden. Das ursprüngliche Skalar-Plugin unterstützt die Visualisierung von Rändern nicht.
Das ist noch nicht möglich. Um dieses Problem zu umgehen, können Sie Ihren benutzerdefinierten Plot in Ihrem eigenen Code (z. B. matplotlib) erstellen und ihn dann in ein SummaryProto
( core/framework/summary.proto
) schreiben und zu Ihrem FileWriter
hinzufügen. Anschließend wird Ihr benutzerdefinierter Plot auf der TensorBoard-Bildregisterkarte angezeigt.
TensorBoard verwendet Reservoir-Sampling, um Ihre Daten herunterzurechnen, damit sie in den RAM geladen werden können. Sie können die Anzahl der Elemente ändern, die pro Tag beibehalten werden, indem Sie das Befehlszeilenargument --samples_per_plugin
verwenden (z. B. --samples_per_plugin=scalars=500,images=20
). Weitere Informationen finden Sie in dieser Frage zum Stapelüberlauf.
Versionen von TensorBoard vor TensorBoard 2.0 würden standardmäßig auf dem Host 0.0.0.0
bereitgestellt, der öffentlich zugänglich ist. Bei diesen Versionen von TensorBoard können Sie die Popups stoppen, indem Sie beim Start --host localhost
angeben.
In TensorBoard 2.0 und höher ist --host localhost
die Standardeinstellung. Verwenden Sie --bind_all
, um das alte Verhalten der Bereitstellung im öffentlichen Netzwerk sowohl auf IPv4 als auch auf IPv6 wiederherzustellen.
tensorboard
ohne eine TensorFlow-Installation ausführen?TensorBoard 1.14+ kann mit einem reduzierten Funktionsumfang ausgeführt werden, wenn Sie TensorFlow nicht installiert haben. Die Hauptbeschränkung besteht darin, dass ab 1.14 nur die folgenden Plugins unterstützt werden: Skalare, benutzerdefinierte Skalare, Bild, Audio, Diagramm, Projektor (teilweise), Verteilungen, Histogramme, Text, PR-Kurven, Netz. Darüber hinaus gibt es keine Unterstützung für Protokollverzeichnisse im Google Cloud Storage.
Siehe DEVELOPMENT.md.
Versuchen Sie zunächst, unsere GitHub-Probleme und Stack Overflow zu durchsuchen. Es kann sein, dass jemand anderes bereits das gleiche Problem oder die gleiche Frage hatte.
Allgemeine Fragen zur Verwendung (oder Probleme, die möglicherweise spezifisch für Ihr lokales Setup sind) wenden Sie sich bitte an Stack Overflow.
Wenn Sie einen Fehler in TensorBoard gefunden haben, reichen Sie bitte ein GitHub-Problem mit so vielen unterstützenden Informationen wie möglich ein (z. B. Anhängen von Ereignisdateien, einschließlich der Ausgabe von tensorboard --inspect
usw.).