TensorFlow - Импорт данных из файла TFEvent TensorBoard?

Я провел несколько тренировок с разными графиками в TensorFlow. Резюме, которые я создал, показывают интересные результаты в обучении и валидации. Теперь я хотел бы взять данные, которые я сохранил в сводных журналах, и выполнить некоторый статистический анализ и в общем сюжете и посмотреть сводные данные по-разному. Существует ли какой-либо существующий способ доступа к этим данным?

В частности, есть ли встроенный способ чтения записи TFEvent на Python?

Если нет простого способа сделать это, TensorFlow заявляет, что все его форматы файлов являются файлами protobuf. Из моего понимания protobufs (который ограничен), я думаю, что смог бы извлечь эти данные, если у меня есть спецификация протокола TFEvent. Есть ли простой способ получить это? Большое вам спасибо.

Ответы

Ответ 1

Как сказал Фабрицио, TensorBoard - это отличный инструмент для визуализации содержимого ваших сводных журналов. Однако, если вы хотите выполнить пользовательский анализ, вы можете использовать функцию tf.train.summary_iterator(), чтобы зациклить все протоколы tf.Event и tf.Summary буферы в журнале:

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

ОБНОВЛЕНИЕ для tf2:

from tensorflow.python.summary import summary_iterator

Вы должны импортировать его, этот уровень модуля в настоящее время не импортируется по умолчанию. На 2.0.0-rc2

Ответ 2

Чтобы прочитать TFEvent, вы можете получить итератор Python, который дает буферы протокола событий.

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

Дополнительная информация: summary_iterator

Ответ 3

Вы можете просто использовать:

tensorboard --inspect --event_file=myevents.out

или если вы хотите отфильтровать определенное подмножество событий графика:

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

Если вы хотите создать что-то более обычное, вы можете вставить

/tensorflow/python/summary/event_file_inspector.py 

чтобы понять, как разбирать файлы событий.

Ответ 4

Вот полный пример получения значений из скаляра. Вы можете увидеть спецификацию сообщения для протокола Protobuf для события здесь

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)

Ответ 5

Следующие работы в версии TenorFlow 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))

код для my_summary_iterator скопирован из tensorflow.python.summary.summary_iterator.py - не было способа импортировать его во время выполнения.

Ответ 6

Вы можете использовать скрипт serialize_tensorboard, который будет принимать logdir и записывать все данные в формате json.

Вы также можете использовать EventAccumulator для удобного API Python (это тот же API, который использует TensorBoard).

Ответ 7

Я использовал это. Предполагается, что вы хотите видеть только те теги, которые вы зарегистрировали более одного раза, значения которых являются плавающими, и возвращает результаты в виде pd.DataFrame. Просто позвоните 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