این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

دسترسی به داده های TensorBoard به عنوان DataFrames

بررسی اجمالی

ویژگی اصلی TensorBoard رابط کاربری گرافیکی تعاملی آن است. با این حال ، کاربران گاهی اوقات می خواهند پرونده هایی را که در TensorBoard ذخیره شده اند ، به طور برنامه ای بخوانند ، برای اهدافی مانند انجام آنالیزهای پس از تعطیلات و ایجاد تجسم های سفارشی از داده های گزارش.

TensorBoard 2.3 از این مورد استفاده با tensorboard.data.experimental.ExperimentFromDev() . این امکان دسترسی به برنامه را به سیاهههای مربوط به مقیاس TensorBoard می دهد. این صفحه کاربرد اصلی این API جدید را نشان می دهد.

برپایی

برای استفاده از API برنامه نویسی ، حتما pandas در کنار tensorboard نصب کنید.

ما برای توطئه های سفارشی در این راهنما از matplotlib و seaborn استفاده خواهیم کرد ، اما می توانید ابزار مورد نظر خود را برای تجزیه و تحلیل و تجسم DataFrame s انتخاب کنید.

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

هنگامی که یک logdir TensorBoard در TensorBoard.dev بارگذاری شد ، به چیزی تبدیل می شود که ما به عنوان یک آزمایش از آن یاد می کنیم. هر آزمایش یک شناسه منحصر به فرد دارد که می توانید در URL TensorBoard.dev این آزمایش مشاهده کنید. برای نمایش خود در زیر ، از آزمایش 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 عبارتند از:

  • run : هر اجرا با یک زیرشاخه اصلی logdir مطابقت دارد. در این آزمایش ، هر اجرا از یک آموزش کامل از یک شبکه عصبی حلقوی (CNN) در مجموعه داده MNIST با یک نوع بهینه ساز مشخص (یک ابرپرامتر آموزشی) است. این DataFrame شامل چندین اجرا می شود ، که مطابق با اجرای تکرار دوره های آموزشی تحت انواع بهینه سازهای مختلف است.
  • tag : این توضیح می دهد که value در همان سطر به چه معنی است ، یعنی چه مقدار را در ردیف نشان می دهد. در این آزمایش ، ما فقط دو برچسب منحصر به فرد داریم: epoch_accuracy و epoch_loss به epoch_loss برای دقت و ضعف.
  • step : این عددی است که ترتیب سریال ردیف مربوطه در اجرای آن را منعکس می کند. در اینجا step در واقع به شماره عصر اشاره دارد. اگر می خواهید علاوه بر مقادیر step ، get_scalars() زمانی را نیز get_scalars() ، می توانید در هنگام فراخوانی get_scalars() از آرگومان کلمه کلیدی get_scalars() include_wall_time=True استفاده کنید.
  • value : این مقدار عددی واقعی بهره است. همانطور که در بالا توضیح داده شد ، هر value در این DataFrame خاص بسته به 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_loss و epoch_accuracy ) در هر مرحله در یک مجموعه مراحل قرار دارند. این امر می تواند با استفاده از آرگومان pivot=True کلمه کلیدی pivot=True یک DataFrame "با فرم گسترده" را مستقیماً از get_scalars() بدست آورد. DataFrame فرم DataFrame دارای تمام برچسب های آن به عنوان ستون های DataFrame است که کار با آن در بعضی موارد از جمله این یکی راحت تر است.

با این حال ، مراقب باشید که اگر شرط داشتن مجموعه های یکنواخت از مقادیر مرحله در همه برچسب ها در همه اجراها برآورده نشود ، استفاده از pivot=True منجر به خطا خواهد شد.

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

توجه کنید که به جای یک ستون واحد "مقدار" ، DataFrame با فرم گسترده شامل دو برچسب (معیار) است که به عنوان ستونهای آن صریح است: epoch_accuracy و epoch_loss .

ذخیره DataFrame به عنوان CSV

pandas.DataFrame قابلیت همکاری خوبی با CSV دارد . می توانید آن را به عنوان یک فایل محلی 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 پشتیبانی نمی شود.

ما می خواهیم این فرضیه را مورد بررسی قرار دهیم که حداقل ضرر در اعتبار سنجی ، بهینه‌سازهای "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 از TensorBoard.dev ارائه می دهد. این نوع تحلیل و تجسم انعطاف پذیر و قدرتمند را که می توانید با DataFrame انجام دهید نشان می دهد.