이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

TensorBoard 데이터를 DataFrame으로 액세스

개요

TensorBoard의 주요 기능은 대화식 GUI입니다. 그러나 사용자는 사후 분석 수행 및 로그 데이터의 사용자 지정 시각화 생성과 같은 목적으로 TensorBoard에 저장된 데이터 로그를 프로그래밍 방식으로 읽기를 원할 수도 있습니다.

TensorBoard 2.3은 tensorboard.data.experimental.ExperimentFromDev()tensorboard.data.experimental.ExperimentFromDev() 사용 사례를 지원합니다. TensorBoard의 스칼라 로그에 프로그래밍 방식으로 액세스 할 수 있습니다. 이 페이지는이 새로운 API의 기본 사용법을 보여줍니다.

설정

프로그래밍 방식의 API를 사용하려면 tensorboard 와 함께 pandas 를 설치해야합니다.

이 가이드에서는 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

A와 TensorBoard 스칼라로드 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 : 각 실행은 원래 logdir의 서브 디렉토리에 해당합니다. 이 실험에서 각 실행은 주어진 옵티 마이저 유형 (훈련 하이퍼 파라미터)을 사용하여 MNIST 데이터 세트에서 CNN (Convolutional Neural Network)을 완전히 훈련 한 것입니다. 이 DataFrame 에는 여러 가지 실행이 포함되어 있으며, 이는 다른 최적화 유형에서 반복되는 교육 실행에 해당합니다.
  • tag : 같은 행의 value 이 의미하는 바, 즉 행에서 값이 나타내는 메트릭을 설명합니다. 이 실험에서는 정확도 및 손실 메트릭에 대해 각각 두 개의 고유 한 태그 인 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 얻기

실험에서 두 개의 태그 ( epoch_lossepoch_accuracy )는 각 실행에서 동일한 단계 세트에 존재합니다. 그러면 pivot=True 키워드 인수를 사용하여 get_scalars() 에서 직접 "wide-form" DataFrame 을 얻을 수 있습니다. 와이드 폼 DataFrame 에는 모든 태그가 DataFrame의 열로 포함되어있어이를 포함하여 일부 경우에 더 편리합니다.

그러나 모든 실행에서 모든 태그에 걸쳐 균일 한 단계 값 세트 조건을 만족하는 조건이 충족되지 않으면 pivot=True 를 사용하면 오류가 발생합니다.

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

와이드 DataFrame은 단일 "값"열 대신 두 개의 태그 (메트릭)를 열로 명시 적으로 포함합니다 ( epoch_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() 의 내장 기능 덕분에 각 곡선은 평균 주위에 ± 1 표준 편차를 표시하므로 이러한 곡선의 변동성과 세 가지 최적화 유형 간의 차이의 중요성을 명확하게 알 수 있습니다. 이 변동성 시각화는 아직 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의 유의 수준에서, 우리의 분석은 최소 검증 손실이 우리 실험에 포함 된 다른 두 최적화 기와 비교하여 rmsprop 최적화에서 훨씬 더 높다 (즉, 더 나쁘다)는 가설을 확인합니다.

요약하면,이 학습서는 panda.DataFrame 에서 panda.DataFrame으로 스칼라 데이터에 액세스하는 방법의 예를 제공합니다. DataFrame 수행 할 수있는 유연하고 강력한 분석 및 시각화의 종류를 보여줍니다.