web-dev-qa-db-fra.com

TensorFlow - Importer des données à partir d'un fichier TensorBoard TFEvent?

J'ai exécuté plusieurs sessions de formation avec différents graphiques dans TensorFlow. Les résumés que j'ai mis en place montrent des résultats intéressants dans la formation et la validation. Maintenant, je voudrais prendre les données que j'ai enregistrées dans les journaux de résumé et effectuer une analyse statistique et dans un tracé général et regarder les données de résumé de différentes manières. Existe-t-il un moyen existant d'accéder facilement à ces données?

Plus précisément, existe-t-il un moyen intégré de lire un enregistrement TFEvent dans Python?

S'il n'y a pas de moyen simple de le faire, TensorFlow déclare que tous ses formats de fichiers sont des fichiers protobuf . D'après ma compréhension des protobufs (qui est limitée), je pense que je serais en mesure d'extraire ces données si j'ai la spécification du protocole TFEvent. Existe-t-il un moyen facile de saisir cela? Merci beaucoup.

36
golmschenk

Comme Fabrizio dit , TensorBoard est un excellent outil pour visualiser le contenu de vos journaux de résumé. Cependant, si vous souhaitez effectuer une analyse personnalisée, vous pouvez utiliser la fonction tf.train.summary_iterator() pour parcourir tous les tf.Event et tf.Summary tampons de protocole dans le journal:

for summary in tf.train.summary_iterator("/path/to/log/file"):
    # Perform custom processing in here.
30
mrry

Pour lire un TFEvent, vous pouvez obtenir un itérateur Python qui génère des tampons de protocole d'événement.

# This example supposes that the events file contains summaries with a
# summary value tag 'loss'.  These could have been added by calling
# `add_summary()`, passing the output of a scalar summary op created with
# with: `tf.scalar_summary(['loss'], loss_tensor)`.
for e in tf.train.summary_iterator(path_to_events_file):
    for v in e.summary.value:
        if v.tag == 'loss' or v.tag == 'accuracy':
            print(v.simple_value)

plus d'informations: summary_iterator

26
Temak

Vous pouvez simplement utiliser:

tensorboard --inspect --event_file=myevents.out

ou si vous souhaitez filtrer un sous-ensemble spécifique d'événements du graphique:

tensorboard --inspect --event_file=myevents.out --tag=loss

Si vous souhaitez créer quelque chose de plus personnalisé, vous pouvez creuser dans le

/tensorflow/python/summary/event_file_inspector.py 

pour comprendre comment analyser les fichiers d'événements.

14
fabrizioM

Travaux suivants à partir de la version tensorflow 2.0.0-beta1:

import os

import tensorflow as tf
from tensorflow.python.framework import tensor_util

summary_dir = 'tmp/summaries'
summary_writer = tf.summary.create_file_writer('tmp/summaries')

with summary_writer.as_default():
  tf.summary.scalar('loss', 0.1, step=42)
  tf.summary.scalar('loss', 0.2, step=43)
  tf.summary.scalar('loss', 0.3, step=44)
  tf.summary.scalar('loss', 0.4, step=45)


from tensorflow.core.util import event_pb2
from tensorflow.python.lib.io import tf_record

def my_summary_iterator(path):
    for r in tf_record.tf_record_iterator(path):
        yield event_pb2.Event.FromString(r)

for filename in os.listdir(summary_dir):
    path = os.path.join(summary_dir, filename)
    for event in my_summary_iterator(path):
        for value in event.summary.value:
            t = tensor_util.MakeNdarray(value.tensor)
            print(value.tag, event.step, t, type(t))

le code pour my_summary_iterator est copié de tensorflow.python.summary.summary_iterator.py - il n'y avait aucun moyen de l'importer lors de l'exécution.

5
Yodogawa Mikio

Voici un exemple complet pour obtenir des valeurs à partir d'un scalaire. Vous pouvez voir la spécification de message pour le message Protobuf d'événement ici

import tensorflow as tf


for event in tf.train.summary_iterator('runs/easy_name/events.out.tfevents.1521590363.DESKTOP-43A62TM'):
    for value in event.summary.value:
        print(value.tag)
        if value.HasField('simple_value'):
            print(value.simple_value)
4
Duane

Vous pouvez utiliser le script serialize_tensorboard , qui prendra un logdir et écrit toutes les données au format json.

Vous pouvez également utiliser un EventAccumulator pour une API Python API (c'est la même API que TensorBoard utilise)).

4
dandelion

J'utilise ça. Il suppose que vous ne voulez voir que les balises que vous avez enregistrées plus d'une fois dont les valeurs sont flottantes et renvoie les résultats sous la forme d'un pd.DataFrame. Appelez simplement metrics_df = parse_events_file(path).

from collections import defaultdict
import pandas as pd
import tensorflow as tf

def is_interesting_tag(tag):
    if 'val' in tag or 'train' in tag:
        return True
    else:
        return False


def parse_events_file(path: str) -> pd.DataFrame:
    metrics = defaultdict(list)
    for e in tf.train.summary_iterator(path):
        for v in e.summary.value:

            if isinstance(v.simple_value, float) and is_interesting_tag(v.tag):
                metrics[v.tag].append(v.simple_value)
            if v.tag == 'loss' or v.tag == 'accuracy':
                print(v.simple_value)
    metrics_df = pd.DataFrame({k: v for k,v in metrics.items() if len(v) > 1})
    return metrics_df
0
Sam Shleifer