ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

الوصول إلى بيانات TensorBoard كإطارات بيانات

نظرة عامة

الميزة الرئيسية لـ TensorBoard هي واجهة المستخدم الرسومية التفاعلية. ومع ذلك، المستخدمين يريدون أحيانا لقراءة سجلات البيانات المخزنة في TensorBoard، لأغراض مثل أداء ما بعد خاص التحليلات وخلق تصورات مخصصة لبيانات السجل برمجيا.

يدعم TensorBoard 2.3 حالة الاستخدام هذه مع tensorboard.data.experimental.ExperimentFromDev() . يسمح بالوصول البرمجي إلى السجلات العددية للوحة TensorBoard. توضح هذه الصفحة الاستخدام الأساسي لواجهة برمجة التطبيقات الجديدة هذه.

اقامة

من أجل استخدام واجهة برمجة التطبيقات البرمجية ، تأكد من تثبيت 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

بمجرد تحميل سجل 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_accuracy و epoch_loss للدقة ومقاييس الخسارة على التوالي.
  • step : هذا رقم يعكس الترتيب التسلسلي للصف المقابل في تشغيله. تشير step هنا في الواقع إلى رقم الحقبة. إذا كنت ترغب في الحصول على الطوابع الزمنية بالإضافة إلى قيم step ، يمكنك استخدام وسيطة الكلمة الأساسية include_wall_time=True عند استدعاء get_scalars() .
  • 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']

الحصول على إطار بيانات محوري (عريض)

في تجربتنا ، epoch_loss ( epoch_loss و epoch_accuracy ) في نفس مجموعة الخطوات في كل شوط. هذا يجعل من الممكن الحصول على DataFrame " DataFrame " مباشرة من get_scalars() باستخدام pivot=True وسيطة الكلمة الأساسية. يشتمل إطار DataFrame على جميع DataFrame المضمنة كأعمدة من DataFrame ، وهو أكثر ملاءمة للعمل معه في بعض الحالات بما في ذلك هذا.

ومع ذلك ، احذر من أنه إذا لم يتم استيفاء شرط وجود مجموعات موحدة من قيم الخطوة عبر جميع العلامات في جميع عمليات التشغيل ، فإن استخدام pivot=True سيؤدي إلى حدوث خطأ.

dfw = experiment.get_scalars(pivot=True) 
dfw

لاحظ أنه بدلاً من عمود "القيمة" الفردي ، يتضمن الإطار العريض DataFrame علامتي (المقاييس) epoch_accuracy بشكل صريح: epoch_accuracy و epoch_loss .

حفظ DataFrame كملف CSV

pandas.DataFrame لديه قابلية 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')

بي إن جي

تعرض المؤامرات أعلاه الدورات الزمنية لدقة التحقق وفقدان التحقق من الصحة. يُظهر كل منحنى المتوسط ​​عبر 5 عمليات تشغيل تحت نوع مُحسِّن. بفضل ميزة seaborn.lineplot() في seaborn.lineplot() ، يعرض كل منحنى أيضًا ± 1 انحرافًا معياريًا حول المتوسط ​​، مما يعطينا إحساسًا واضحًا بالتنوع في هذه المنحنيات وأهمية الاختلافات بين أنواع المحسنات الثلاثة. لم يتم دعم تصور التباين هذا في واجهة المستخدم الرسومية لـ TensorBoard.

نريد دراسة الفرضية القائلة بأن الحد الأدنى من فقدان التحقق يختلف اختلافًا كبيرًا بين أدوات تحسين "adam" و "rmsprop" و "sgd". لذلك نقوم باستخراج DataFrame للحد الأدنى من فقدان التحقق من الصحة تحت كل من المُحسِنين.

ثم نقوم بعمل boxplot لتصور الفرق في الحد الأدنى من خسائر التحقق من الصحة.

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>

بي إن جي

# 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 s من TensorBoard.dev. يوضح نوع التحليلات والتصور DataFrame التي يمكنك القيام بها باستخدام DataFrame s.