Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

TensorBoard Verilerine DataFrames Olarak Erişme

genel bakış

TensorBoard'un ana özelliği etkileşimli GUI'sidir. Bununla birlikte, kullanıcılar bazen post-hoc analizler yapmak ve günlük verilerinin özel görselleştirmelerini oluşturmak gibi amaçlar için TensorBoard'da depolanan veri günlüklerini programlı olarak okumak isterler.

TensorBoard 2.3, tensorboard.data.experimental.ExperimentFromDev() ile bu kullanım durumunu desteklemektedir. TensorBoard'un skaler günlüklerine programlı erişim sağlar. Bu sayfa, bu yeni API'nın temel kullanımını göstermektedir.

Kurmak

Programlı API'yı kullanmak için, tensorboard yanına pandas yüklediğinizden emin olun.

Bu kılavuzdaki özel grafikler için matplotlib ve seaborn kullanacağız, ancak DataFrame analiz etmek ve görselleştirmek için tercih ettiğiniz aracı seçebilirsiniz.

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 skalerlerini panda olarak pandas.DataFrame

TensorBoard günlük dosyası TensorBoard.dev'e yüklendikten sonra, deneme olarak adlandırdığımız şey olur. Her denemenin, deneyin TensorBoard.dev URL'sinde bulunan benzersiz bir kimliği vardır. Aşağıdaki gösterimiz için şu adresten bir TensorBoard.dev denemesi kullanacağız: https://tensorboard.dev/experiment/c1KCv3X3QvGwaXfgX1c4tg

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

df , pandas.DataFrame tüm skaler günlüklerini içeren bir pandas.DataFrame .

DataFrame sütunları şunlardır:

  • run : her run, orijinal logdir'in bir alt dizinine karşılık gelir. Bu deneyde, her çalışma, MNIST veri kümesinde verilen bir optimizasyon tipi (bir eğitim hiperparametresi) ile evrişimli bir sinir ağının (CNN) tam bir eğitiminden alınmıştır. Bu DataFrame , farklı iyileştirici türleri altında tekrarlanan eğitim çalışmalarına karşılık gelen bu tür birden fazla DataFrame içerir.
  • tag : bu, aynı satırdaki value ne anlama geldiğini, yani değerin satırda hangi metriği temsil ettiğini açıklar. Bu deneyde yalnızca iki benzersiz epoch_accuracy : sırasıyla doğruluk ve kayıp metrikleri için epoch_accuracy ve epoch_loss .
  • step : Bu, ilgili satırın çalışma sırasındaki seri sırasını yansıtan bir sayıdır. Burada step aslında çağ sayısını ifade eder. step değerlerine ek olarak zaman damgalarını almak istiyorsanız, get_scalars() çağırırken include_wall_time=True anahtar sözcüğünü kullanabilirsiniz.
  • value : İlginin gerçek sayısal değeridir. Yukarıda açıklandığı gibi, bu belirli DataFrame her value , satırın tag bağlı olarak bir kayıp veya doğruluktur.
 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']

Dönen (geniş biçimli) bir DataFrame'i alma

epoch_loss , iki etiket ( epoch_loss ve epoch_accuracy ) her çalışmada aynı adım kümesinde bulunur. Bu, pivot=True anahtar kelime bağımsız değişkenini kullanarak doğrudan get_scalars() DataFrame "geniş biçimli" bir DataFrame almayı mümkün kılar. Geniş biçimli DataFrame , tüm etiketlerini DataFrame'in sütunları olarak içerir;

Ancak, tüm çalışmalarda tüm etiketler arasında adım değerlerinin tekdüze kümelerine sahip olma koşulunun karşılanmadığı takdirde, pivot=True kullanıldığında hataya neden olacağına dikkat edin.

 dfw = experiment.get_scalars(pivot=True) 
dfw
 

Geniş biçimli DataFrame'in tek bir "değer" sütunu yerine, sütunları açıkça iki etiketi (metrikleri) içerdiğine dikkat edin: epoch_accuracy ve epoch_loss .

DataFrame'i CSV olarak kaydetme

pandas.DataFrame CSV ile iyi birlikte çalışabilirliğe sahiptir. Yerel bir CSV dosyası olarak saklayabilir ve daha sonra geri yükleyebilirsiniz. Örneğin:

 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)
 

Özel görselleştirme ve istatistiksel analiz yapma

 # 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

Yukarıdaki grafikler, doğrulama doğruluğu ve doğrulama kaybının zaman çizelgelerini göstermektedir. Her eğri, bir iyileştirici türü altında 5 çalışma boyunca ortalamayı gösterir. seaborn.lineplot() yerleşik bir özelliği sayesinde, her eğri de ortalama etrafında ± 1 standart sapma gösterir, bu da bize bu eğrilerdeki değişkenliği ve üç optimize edici türü arasındaki farkların önemini açıkça verir. Bu değişkenliğin görselleştirilmesi henüz TensorBoard'un GUI'sinde desteklenmemektedir.

Minimum validasyon kaybının "adam", "rmsprop" ve "sgd" optimize edicilerinden önemli ölçüde farklı olduğu hipotezini incelemek istiyoruz. Bu nedenle, optimize edicilerin her birinin altında minimum doğrulama kaybı için bir DataFrame çıkarıyoruz.

Ardından, asgari doğrulama kayıplarındaki farkı görselleştirmek için bir kutu çizim yaparız.

 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

Bu nedenle, 0.05'lik anlamlılık düzeyinde, analizimiz, minimum validasyon kaybının, rmsprop optimizatörde, deneyimize dahil edilen diğer iki optimize edici ile karşılaştırıldığında önemli ölçüde daha yüksek (yani, daha kötü) olduğu hipotezimizi doğrulamaktadır.

Özetle, bu öğretici panda.DataFrame s olarak skaler verilere nasıl erişileceğini gösteren bir örnek sunmaktadır. DataFrame yapabileceğiniz esnek ve güçlü analiz ve görselleştirme DataFrame .