このページは Cloud Translation API によって翻訳されました。
Switch to English

TensorBoardデータへのデータフレームとしてのアクセス

概観

TensorBoardの主な機能は、インタラクティブなGUIです。ただし、事後分析の実行やログデータのカスタム視覚化の作成などの目的で、TensorBoardに保存されているデータログをプログラムで読み取る必要がある場合があります。

TensorBoard 2.3は、 tensorboard.data.experimental.ExperimentFromDev()でこの使用例をサポートしています。 TensorBoardのスカラーログへのプログラムによるアクセスを可能にします。このページでは、この新しいAPIの基本的な使用方法を示します。

セットアップ

プログラムによるAPIを使用するには、 tensorboardと一緒にpandasをインストールしてください。

このガイドでは、カスタムプロットにmatplotlibseabornを使用しmatplotlibseabornを分析および視覚化するためのDataFrameツールを選択できます。

pip install tensorboard pandas
pip install matplotlib seaborn
 from packaging import version

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
from scipy import stats
import tensorboard as tb
 
 major_ver, minor_ver, _ = version.parse(tb.__version__).release
assert major_ver >= 2 and minor_ver >= 3, \
    "This notebook requires TensorBoard 2.3 or later."
print("TensorBoard version: ", tb.__version__)
 
TensorBoard version:  2.3.0a20200626

TensorBoardスカラーをpandas.DataFrameとしてpandas.DataFrame

TensorBoard logdirがTensorBoard.devにアップロードされると、これが実験と呼ばれるものになります。各実験には一意のIDがあり、実験のTensorBoard.dev URLにあります。以下のデモでは、TensorBoard.dev実験を使用しますhttps ://tensorboard.dev/experiment/c1KCv3X3QvGwaXfgX1c4tg

 experiment_id = "c1KCv3X3QvGwaXfgX1c4tg"
experiment = tb.data.experimental.ExperimentFromDev(experiment_id)
df = experiment.get_scalars()
df
 

dfは、実験のすべてのスカラーログを含むpandas.DataFrameです。

DataFrameの列は次のDataFrameです。

  • run :各runは、元のlogdirのサブディレクトリに対応しています。この実験では、各実行は、特定のオプティマイザータイプ(トレーニングハイパーパラメーター)を使用したMNISTデータセットでの畳み込みニューラルネットワーク(CNN)の完全なトレーニングからのものです。このDataFrameは、このような複数の実行が含まれています。これらの実行は、異なるオプティマイザータイプでの繰り返しトレーニング実行に対応しています。
  • tag :これは、同じ行のvalueが何を意味するか、つまり、 valueが行でどのメトリックを表すかを示します。この実験では、2つの一意のタグのみが存在します。それぞれ、精度メトリックと損失メトリックのepoch_accuracyepoch_lossです。
  • step :これは、実行中の対応する行のシリアル順を反映する番号です。ここでのstep実際にはエポック番号を指します。 step値に加えてタイムスタンプを取得したい場合は、 get_scalars()呼び出すときにキーワード引数include_wall_time=True使用できます。
  • value :これは、対象となる実際の数値です。上記のように、この特定のDataFramevalueは、行のtagに応じて、損失または精度のいずれかになります。
 print(df["run"].unique())
print(df["tag"].unique())
 
['adam,run_1/train' 'adam,run_1/validation' 'adam,run_2/train'
 'adam,run_2/validation' 'adam,run_3/train' 'adam,run_3/validation'
 'adam,run_4/train' 'adam,run_4/validation' 'adam,run_5/train'
 'adam,run_5/validation' 'rmsprop,run_1/train' 'rmsprop,run_1/validation'
 'rmsprop,run_2/train' 'rmsprop,run_2/validation' 'rmsprop,run_3/train'
 'rmsprop,run_3/validation' 'rmsprop,run_4/train'
 'rmsprop,run_4/validation' 'rmsprop,run_5/train'
 'rmsprop,run_5/validation' 'sgd,run_1/train' 'sgd,run_1/validation'
 'sgd,run_2/train' 'sgd,run_2/validation' 'sgd,run_3/train'
 'sgd,run_3/validation' 'sgd,run_4/train' 'sgd,run_4/validation'
 'sgd,run_5/train' 'sgd,run_5/validation']
['epoch_accuracy' 'epoch_loss']

ピボットされた(ワイド形式の)DataFrameを取得する

この実験では、2つのタグ( epoch_lossおよびepoch_accuracy )が、各実行の同じステップのセットに存在します。これにより、 pivot=Trueキーワード引数を使用して、 get_scalars()から直接「ワイドフォーム」のDataFrameを取得できます。ワイドフォームのDataFrameは、DataFrameの列として含まれているすべてのタグがあります。これは、これを含むいくつかのケースでの作業に便利です。

ただし、すべての実行ですべてのタグにわたってステップ値の均一なセットを持つ条件が満たされていない場合、 pivot=Trueを使用するとエラーが発生することに注意してください。

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

ワイドフォームDataFrameには、単一の「値」列の代わりに、列として2つのタグ(メトリック)が明示的に含まれていることにepoch_accuracyしてepoch_lossepoch_accuracyepoch_loss

DataFrameをCSVとして保存

pandas.DataFrameCSVとの相互運用性が優れています。これをローカルCSVファイルとして保存し、後で読み込むことができます。例えば:

 csv_path = '/tmp/tb_experiment_1.csv'
dfw.to_csv(csv_path, index=False)
dfw_roundtrip = pd.read_csv(csv_path)
pd.testing.assert_frame_equal(dfw_roundtrip, dfw)
 

カスタムの視覚化と統計分析の実行

 # Filter the DataFrame to only validation data, which is what the subsequent
# analyses and visualization will be focused on.
dfw_validation = dfw[dfw.run.str.endswith("/validation")]
# Get the optimizer value for each row of the validation DataFrame.
optimizer_validation = dfw_validation.run.apply(lambda run: run.split(",")[0])

plt.figure(figsize=(16, 6))
plt.subplot(1, 2, 1)
sns.lineplot(data=dfw_validation, x="step", y="epoch_accuracy",
             hue=optimizer_validation).set_title("accuracy")
plt.subplot(1, 2, 2)
sns.lineplot(data=dfw_validation, x="step", y="epoch_loss",
             hue=optimizer_validation).set_title("loss")
 
Text(0.5, 1.0, 'loss')

png

上のプロットは、検証精度と検証損失の時間経過を示しています。各曲線は、オプティマイザタイプでの5回の実行の平均を示しています。 seaborn.lineplot()seaborn.lineplot()機能のseaborn.lineplot() 、各曲線は平均の周りに±1標準偏差も表示します。これにより、これらの曲線の変動性と3つのオプティマイザータイプ間の違いの重要性が明確になります。この変動の視覚化は、TensorBoardのGUIではまだサポートされていません。

最小の検証損失が「adam」、「rmsprop」、「sgd」オプティマイザ間で大幅に異なるという仮説を検討したいと思います。したがって、各オプティマイザでの検証損失が最小になるようにDataFrameを抽出します。

次に箱ひげ図を作成して、最小検証損失の違いを視覚化します。

 adam_min_val_loss = dfw_validation.loc[optimizer_validation=="adam", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
rmsprop_min_val_loss = dfw_validation.loc[optimizer_validation=="rmsprop", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
sgd_min_val_loss = dfw_validation.loc[optimizer_validation=="sgd", :].groupby(
    "run", as_index=False).agg({"epoch_loss": "min"})
min_val_loss = pd.concat([adam_min_val_loss, rmsprop_min_val_loss, sgd_min_val_loss])

sns.boxplot(data=min_val_loss, y="epoch_loss",
            x=min_val_loss.run.apply(lambda run: run.split(",")[0]))
 
<matplotlib.axes._subplots.AxesSubplot at 0x7f5e017c8150>

png

 # Perform pairwise comparisons between the minimum validation losses
# from the three optimizers.
_, p_adam_vs_rmsprop = stats.ttest_ind(
    adam_min_val_loss["epoch_loss"],
    rmsprop_min_val_loss["epoch_loss"]) 
_, p_adam_vs_sgd = stats.ttest_ind(
    adam_min_val_loss["epoch_loss"],
    sgd_min_val_loss["epoch_loss"]) 
_, p_rmsprop_vs_sgd = stats.ttest_ind(
    rmsprop_min_val_loss["epoch_loss"],
    sgd_min_val_loss["epoch_loss"]) 
print("adam vs. rmsprop: p = %.4f" % p_adam_vs_rmsprop)
print("adam vs. sgd: p = %.4f" % p_adam_vs_sgd)
print("rmsprop vs. sgd: p = %.4f" % p_rmsprop_vs_sgd)
 
adam vs. rmsprop: p = 0.0244
adam vs. sgd: p = 0.9749
rmsprop vs. sgd: p = 0.0135

したがって、0.05の有意水準で、私たちの分析は、最小検証の損失が、実験に含まれる他の2つのオプティマイザーと比較してrmspropオプティマイザーで大幅に高い(つまり、悪い)との仮説を確認します。

要約すると、このチュートリアルでは、 panda.DataFrameからpanda.DataFrameとしてスカラーデータにアクセスする方法の例を示します。 DataFrame実行できる、柔軟で強力な分析と視覚化の種類を示します。