หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

การเข้าถึงข้อมูล TensorBoard เป็น DataFrames

ภาพรวม

คุณสมบัติหลักของ TensorBoard คือ GUI แบบโต้ตอบ อย่างไรก็ตามในบางครั้งผู้ใช้ต้องการอ่านบันทึกข้อมูลโดยทาง โปรแกรม เพื่อเก็บไว้ใน TensorBoard เพื่อวัตถุประสงค์เช่นทำการวิเคราะห์หลังการโพสต์เฉพาะกิจและสร้างการสร้างภาพข้อมูลที่กำหนดเองของข้อมูลบันทึก

TensorBoard 2.3 รองรับกรณีการใช้งานนี้กับ tensorboard.data.experimental.ExperimentFromDev() อนุญาตให้เข้าถึง แบบบันทึกโปรแกรมสเกลา ของ TensorBoard หน้านี้แสดงให้เห็นถึงการใช้งานพื้นฐานของ API ใหม่นี้

ติดตั้ง

เพื่อที่จะใช้ API ของการเขียนโปรแกรมให้แน่ใจว่าคุณติดตั้ง pandas ข้าง tensorboard

เราจะใช้ matplotlib และ seaborn สำหรับแปลงที่กำหนดเองในคู่มือนี้ แต่คุณสามารถเลือกเครื่องมือที่คุณต้องการในการวิเคราะห์และแสดงภาพ 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

เมื่ออัปโหลด TensorBoard logdir ไปยัง TensorBoard.dev แล้วจะกลายเป็นสิ่งที่เราเรียกว่าการ ทดสอบ การทดสอบแต่ละรายการมี ID ที่ไม่ซ้ำกันซึ่งสามารถพบได้ใน 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 : การ run แต่ละครั้งสอดคล้องกับไดเรกทอรีย่อยของ logdir ดั้งเดิม ในการทดสอบนี้การทดสอบแต่ละครั้งนั้นมาจากการฝึกอบรมที่สมบูรณ์ของโครงข่ายประสาทเทียม (CNN) ในชุดข้อมูล MNIST ด้วยประเภทเครื่องมือเพิ่มประสิทธิภาพที่กำหนด (พารามิเตอร์การฝึกอบรมมากเกินไป) DataFrame นี้มีการรันหลายครั้งซึ่งสอดคล้องกับการฝึกซ้อมซ้ำภายใต้ประเภทเครื่องมือเพิ่มประสิทธิภาพที่แตกต่างกัน
  • tag : สิ่งนี้จะอธิบายความหมายของ value ในแถวเดียวกันหมายความว่าคือค่าใดที่แสดงถึงค่าในแถว ในการทดสอบนี้เรามีแท็กที่ไม่ซ้ำกันสองแท็กเท่านั้น: 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']

การรับ DataFrame ที่หมุนได้ (แบบกว้าง)

ในการทดสอบของเราแท็กสองแท็ก ( epoch_loss และ epoch_accuracy ) มีอยู่ในขั้นตอนชุดเดียวกันในการทำงานแต่ละครั้ง สิ่งนี้ทำให้สามารถรับ DataFrame "แบบกว้าง" ได้โดยตรงจาก get_scalars() โดยใช้อาร์กิวเมนต์ pivot=True 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 รอบค่าเฉลี่ยซึ่งทำให้เราเข้าใจได้อย่างชัดเจนถึงความแปรปรวนในเส้นโค้งเหล่านี้และความสำคัญของความแตกต่างระหว่างสามประเภทเครื่องมือเพิ่มประสิทธิภาพ การสร้างภาพความแปรปรวนนี้ยังไม่ได้รับการสนับสนุนใน GUI ของ TensorBoard

เราต้องการศึกษาสมมติฐานที่ว่าการสูญเสียการตรวจสอบขั้นต่ำแตกต่างกันอย่างมีนัยสำคัญ beteth "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>

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 s จาก TensorBoard.dev มันแสดงให้เห็นถึงชนิดของการวิเคราะห์และการแสดงภาพที่ยืดหยุ่นและทรงพลังที่คุณสามารถทำได้ด้วย DataFrame s