Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Mengakses Data TensorBoard sebagai DataFrames

Gambaran

Fitur utama TensorBoard adalah GUI interaktifnya. Namun, pengguna terkadang ingin secara terprogram membaca log data yang disimpan di TensorBoard, untuk tujuan seperti melakukan analisis post-hoc dan membuat visualisasi khusus data log.

TensorBoard 2.3 mendukung use case ini dengan tensorboard.data.experimental.ExperimentFromDev() . Ini memungkinkan akses terprogram ke log skalar TensorBoard. Halaman ini menunjukkan penggunaan dasar API baru ini.

Mempersiapkan

Untuk menggunakan API terprogram, pastikan Anda menginstal pandas samping tensorboard .

Kami akan menggunakan matplotlib dan seaborn untuk plot khusus dalam panduan ini, tetapi Anda dapat memilih alat pilihan Anda untuk menganalisis dan memvisualisasikan 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

Memuat TensorBoard skalar sebagai pandas.DataFrame

Setelah logdir TensorBoard telah diunggah ke TensorBoard.dev, itu menjadi apa yang kami sebut sebagai eksperimen . Setiap percobaan memiliki ID unik, yang dapat ditemukan di URL TensorBoard.dev percobaan. Untuk demonstrasi kami di bawah ini, kami akan menggunakan eksperimen TensorBoard.dev di: https://tensorboard.dev/experiment/c1KCv3X3QvGwaXfgX1c4tg

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

df adalah pandas.DataFrame yang berisi semua log skalar percobaan.

Kolom DataFrame adalah:

  • run : setiap run berhubungan dengan subdirektori dari logdir asli. Dalam percobaan ini, setiap percobaan berasal dari pelatihan lengkap jaringan saraf convolutional (CNN) pada dataset MNIST dengan jenis pengoptimal yang diberikan (hyperparameter pelatihan). DataFrame ini berisi beberapa proses semacam itu, yang terkait dengan pelatihan berulang yang dilakukan di bawah jenis pengoptimal yang berbeda.
  • tag : ini menjelaskan apa arti value dalam baris yang sama, yaitu, apa yang diwakili oleh nilai metrik di baris tersebut. Dalam percobaan ini, kami hanya memiliki dua tag unik: epoch_accuracy dan epoch_loss masing-masing untuk akurasi dan kehilangan metrik.
  • step : Ini adalah angka yang mencerminkan urutan serial dari baris terkait dalam menjalankannya. Di sini step sebenarnya mengacu pada nomor zaman. Jika Anda ingin mendapatkan cap waktu di samping nilai step , Anda dapat menggunakan argumen kata kunci include_wall_time=True saat memanggil get_scalars() .
  • value : Ini adalah nilai numerik aktual bunga. Seperti dijelaskan di atas, setiap value dalam DataFrame tertentu ini adalah kerugian atau akurasi, tergantung pada tag baris.
 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']

Mendapatkan DataFrame pivot (bentuk lebar)

Dalam percobaan kami, dua tag ( epoch_loss dan epoch_accuracy ) hadir pada set langkah yang sama di setiap proses. Ini memungkinkan untuk mendapatkan DataFrame "bentuk-lebar" langsung dari get_scalars() dengan menggunakan pivot=True argumen kata kunci pivot=True . DataFrame bentuk DataFrame memiliki semua tag yang disertakan sebagai kolom DataFrame, yang lebih nyaman digunakan dalam beberapa kasus termasuk yang ini.

Namun, berhati-hatilah bahwa jika kondisi memiliki set nilai langkah yang seragam di semua tag dalam semua proses tidak terpenuhi, menggunakan pivot=True akan menghasilkan kesalahan.

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

Perhatikan bahwa alih-alih kolom "nilai" tunggal, DataFrame bentuk lebar menyertakan dua tag (metrik) sebagai kolomnya secara eksplisit: epoch_accuracy dan epoch_loss .

Menyimpan DataFrame sebagai CSV

pandas.DataFrame memiliki interoperabilitas yang baik dengan CSV . Anda dapat menyimpannya sebagai file CSV lokal dan memuatnya kembali nanti. Sebagai contoh:

 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)
 

Melakukan visualisasi khusus dan analisis statistik

 # 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

Plot di atas menunjukkan timecourses keakuratan validasi dan kehilangan validasi. Setiap kurva menunjukkan rata-rata di 5 jalur di bawah tipe pengoptimal. Berkat fitur seaborn.lineplot() , setiap kurva juga menampilkan ± 1 standar deviasi di sekitar rata-rata, yang memberi kami pemahaman yang jelas tentang variabilitas dalam kurva ini dan pentingnya perbedaan di antara ketiga jenis pengoptimal. Visualisasi variabilitas ini belum didukung di GUI TensorBoard.

Kami ingin mempelajari hipotesis bahwa kehilangan validasi minimum berbeda secara signifikan antara pengoptimal "adam", "rmsprop" dan "sgd". Jadi kami mengekstrak DataFrame untuk kehilangan validasi minimum di bawah setiap pengoptimal.

Kemudian kami membuat boxplot untuk memvisualisasikan perbedaan dalam kerugian validasi minimum.

 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

Oleh karena itu, pada tingkat signifikansi 0,05, analisis kami mengkonfirmasi hipotesis kami bahwa kehilangan validasi minimum secara signifikan lebih tinggi (yaitu, lebih buruk) dalam pengoptimal rmsprop dibandingkan dengan dua pengoptimal lain yang termasuk dalam percobaan kami.

Singkatnya, tutorial ini memberikan contoh bagaimana mengakses data skalar sebagai panda.DataFrame dari TensorBoard.dev. Ini menunjukkan jenis analisis dan visualisasi yang fleksibel dan kuat yang dapat Anda lakukan dengan DataFrame .