TensorFlowでさまざまなグラフを使用していくつかのトレーニングセッションを実行しました。私が設定した要約は、トレーニングと検証において興味深い結果を示しています。次に、要約ログに保存したデータを取得し、統計分析と一般的なプロットを実行して、さまざまな方法で要約データを調べます。このデータに簡単にアクセスする既存の方法はありますか?
より具体的には、TFEventレコードを読み込んでPythonに戻す方法が組み込まれていますか?
これを行う簡単な方法がない場合、 TensorFlowはすべてのファイル形式がprotobufファイルであると述べています 。 protobufs(これは制限されています)の私の理解から、TFEventプロトコル仕様があれば、このデータを抽出できると思います。これを簡単に把握する方法はありますか?どうもありがとうございます。
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.
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
次を使用できます。
tensorboard --inspect --event_file=myevents.out
または、グラフのイベントの特定のサブセットをフィルタリングする場合:
tensorboard --inspect --event_file=myevents.out --tag=loss
よりカスタムなものを作成したい場合は、
/tensorflow/python/summary/event_file_inspector.py
イベントファイルの解析方法を理解する。
以下は、テンソルフローバージョン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
からコピーされます-実行時にインポートする方法はありませんでした。
以下は、スカラーから値を取得するための完全な例です。 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)
スクリプト serialize_tensorboard を使用できます。これは、logdirを取り込んで、json形式ですべてのデータを書き出します。
EventAccumulator を使用して、便利なPython API(これはTensorBoardが使用するものと同じAPI)です。
私はこれを使用しています。値が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
_