web-dev-qa-db-ja.com

TensorFlow-TensorBoard TFEventファイルからデータをインポートしますか?

TensorFlowでさまざまなグラフを使用していくつかのトレーニングセッションを実行しました。私が設定した要約は、トレーニングと検証において興味深い結果を示しています。次に、要約ログに保存したデータを取得し、統計分析と一般的なプロットを実行して、さまざまな方法で要約データを調べます。このデータに簡単にアクセスする既存の方法はありますか?

より具体的には、TFEventレコードを読み込んでPythonに戻す方法が組み込まれていますか?

これを行う簡単な方法がない場合、 TensorFlowはすべてのファイル形式がprotobufファイルであると述べています 。 protobufs(これは制限されています)の私の理解から、TFEventプロトコル仕様があれば、このデータを抽出できると思います。これを簡単に把握する方法はありますか?どうもありがとうございます。

36
golmschenk

Fabrizio says のように、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.
30
mrry

TFEventを読み取るには、Python Eventプロトコルバッファーを生成する反復子を取得できます。

# 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

26
Temak

次を使用できます。

tensorboard --inspect --event_file=myevents.out

または、グラフのイベントの特定のサブセットをフィルタリングする場合:

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

よりカスタムなものを作成したい場合は、

/tensorflow/python/summary/event_file_inspector.py 

イベントファイルの解析方法を理解する。

14
fabrizioM

以下は、テンソルフローバージョン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からコピーされます-実行時にインポートする方法はありませんでした。

5
Yodogawa Mikio

以下は、スカラーから値を取得するための完全な例です。 Event protobufメッセージのメッセージ仕様を確認できます here

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

スクリプト serialize_tensorboard を使用できます。これは、logdirを取り込んで、json形式ですべてのデータを書き出します。

EventAccumulator を使用して、便利なPython API(これはTensorBoardが使用するものと同じAPI)です。

4
dandelion

私はこれを使用しています。値がfloatであるログを複数回記録したタグのみを見たいと想定し、結果を_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
_
0
Sam Shleifer