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

DataFrame olarak TensorBoard Verilerine Erişim

Genel Bakış

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

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

Kurmak

tensorboard API'yi kullanmak için, pandas tensorboard birlikte yüklediğinizden emin olun.

Bu kılavuzda ö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 pandalar olarak pandas.DataFrame

Bir TensorBoard LogDir TensorBoard.dev aktarıldıktan sonra, biz bir deney olarak bakın ne hale gelir. Her deney, denemenin TensorBoard.dev URL'sinde bulunabilen benzersiz bir kimliğe sahiptir. Aşağıdaki gösterimiz için, bir TensorBoard.dev deneyi 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 çalıştırma, orijinal günlük dizininin bir alt dizinine karşılık gelir. Bu deneyde, her çalışma, belirli bir optimize edici tip (bir eğitim hiper parametresi) ile MNIST veri kümesinde bir evrişimli sinir ağının (CNN) tam bir eğitiminden alınmıştır. Bu DataFrame , farklı optimize edici türleri altında tekrarlanan eğitim çalışmalarına karşılık gelen bu tür birden çok çalıştırma içerir.
  • tag : Bu, aynı satırdaki value ne anlama geldiğini, yani satırda değerin hangi metriği temsil ettiğini açıklar. Bu deneyde, yalnızca iki benzersiz epoch_accuracy : sırasıyla doğruluk ve kayıp ölçümleri için epoch_accuracy ve epoch_loss .
  • step : Bu, çalışmasında karşılık gelen satırın seri sırasını yansıtan bir sayıdır. Buradaki step aslında çağ numarasını ifade eder. step değerlerine ek olarak zaman damgalarını da almak isterseniz, get_scalars() include_wall_time=True anahtar kelime bağımsız değişkenini kullanabilirsiniz.
  • value : Bu, ilginin gerçek sayısal değeridir. Yukarıda açıklandığı gibi, bu belirli DataFrame her bir 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']

Özetlenmiş (geniş biçimli) bir DataFrame elde etme

epoch_loss , iki etiket ( epoch_loss ve epoch_accuracy ) her çalışmada aynı adım kümesinde mevcuttur. Bu, pivot=True anahtar kelime bağımsız değişkenini kullanarak doğrudan get_scalars() dan "geniş biçimli" bir DataFrame elde etmeyi mümkün kılar. Geniş biçimli DataFrame tüm etiketleri DataFrame'in sütunları olarak dahil edilmiştir ve bu da dahil olmak üzere bazı durumlarda çalışmak daha uygundur.

Ancak, tüm çalıştırmalarda tüm etiketlerde tek tip adım değerleri kümelerine sahip olma koşulu karşılanmazsa, pivot=True kullanılmasının bir hatayla sonuçlanacağına dikkat edin.

dfw = experiment.get_scalars(pivot=True) 
dfw

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

DataFrame'i CSV olarak kaydetme

pandas.DataFrame , CSV ile iyi bir birlikte çalışabilirliğe sahiptir. Yerel bir CSV dosyası olarak saklayabilir ve daha sonra tekrar 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 gerçekleştirme

# 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 süreçlerini göstermektedir. Her eğri, bir optimize edici türü altında 5 çalıştırmada ortalamayı gösterir. seaborn.lineplot() yerleşik bir özelliği sayesinde, her eğri ortalama etrafında ± 1 standart sapma gösterir, bu da bize bu eğrilerdeki değişkenlik ve üç optimize edici türü arasındaki farkların önemi hakkında net bir fikir verir. Bu değişkenliğin görselleştirilmesi henüz TensorBoard'ın GUI'sinde desteklenmemektedir.

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

Ardından, minimum doğrulama kayıplarındaki farkı görselleştirmek için bir kutu grafiği 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 önem düzeyinde, analizimiz, rmsprop optimize edicideki minimum doğrulama kaybının, deneyimize dahil edilen diğer iki optimize ediciye kıyasla önemli ölçüde daha yüksek (yani daha kötü) olduğu hipotezimizi doğrulamaktadır.

Özet olarak, bu öğretici panda.DataFrame olarak skaler verilere nasıl erişileceğine dair bir örnek sağlar. DataFrame ler ile yapabileceğiniz esnek ve güçlü analiz ve görselleştirme DataFrame .