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. BuDataFrame
, 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ırdakivalue
ne anlama geldiğini, yani satırda değerin hangi metriği temsil ettiğini açıklar. Bu deneyde, yalnızca iki benzersizepoch_accuracy
: sırasıyla doğruluk ve kayıp ölçümleri içinepoch_accuracy
veepoch_loss
. -
step
: Bu, çalışmasında karşılık gelen satırın seri sırasını yansıtan bir sayıdır. Buradakistep
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 belirliDataFrame
her birvalue
, satırıntag
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')
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>
# 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
.