TensorBoard Scalars: Keras'ta eğitim ölçümlerini günlüğe kaydetme

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin

genel bakış

Makine öğrenimi, her zaman kayıp ve eğitim ilerledikçe nasıl değiştikleri gibi temel metrikleri anlamayı içerir. Bu ölçümler, eğer anlamanıza yardımcı olabilir overfitting örneğin, ya da çok uzun süre eğer ediyoruz gereksiz yere eğitimi. Modelinizi hata ayıklamaya ve iyileştirmeye yardımcı olması için bu ölçümleri farklı eğitim çalıştırmalarında karşılaştırmak isteyebilirsiniz.

TensorBoard en Skalerler Dashboard çok az çaba ile basit bir API kullanarak bu ölçümleri görüntülemenizi sağlar. Bu öğretici, Keras modelinizi geliştirirken bu API'leri TensorBoard ile nasıl kullanacağınızı öğrenmenize yardımcı olacak çok temel örnekler sunar. Varsayılan ve özel skalerleri görselleştirmek için Keras TensorBoard geri çağırma ve TensorFlow Özet API'lerini nasıl kullanacağınızı öğreneceksiniz.

Kurmak

# Load the TensorBoard notebook extension.
%load_ext tensorboard
from datetime import datetime
from packaging import version

import tensorflow as tf
from tensorflow import keras

import numpy as np

print("TensorFlow version: ", tf.__version__)
assert version.parse(tf.__version__).release[0] >= 2, \
    "This notebook requires TensorFlow 2.0 or above."
TensorFlow version:  2.2

Basit bir regresyon için verileri ayarlayın

Artık kullanacağız keras bir eşleştirilmiş veri seti için uyum iyi satırı bulun, yani bir gerileme hesaplamak için. (Sinir ağları ve gradyan arttırma kullanırken olduğu sorun bu tür için overkill çok kolay anlamak için örneğin markasını yapar.)

Sen dönemini genelinde nasıl eğitim ve test kaybı değişikliği gözlemlemek için TensorBoard kullanacağız. Umarım, eğitim ve test kaybının zamanla azaldığını ve ardından sabit kaldığını göreceksiniz.

İlk olarak, yaklaşık hattı y = 0.5x + 2 boyunca 1000 veri noktası oluşturur. Bu veri noktalarını eğitim ve test kümelerine ayırın. Umudunuz, sinir ağının bu ilişkiyi öğrenmesidir.

data_size = 1000
# 80% of the data is for training.
train_pct = 0.8

train_size = int(data_size * train_pct)

# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size)
np.random.shuffle(x)

# Generate the output data.
# y = 0.5x + 2 + noise
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))

# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size]
x_test, y_test = x[train_size:], y[train_size:]

Modeli eğitme ve günlük kaybı

Artık modelinizi tanımlamaya, eğitmeye ve değerlendirmeye hazırsınız.

Antrenman olarak zarar sayıl oturum açmak için, aşağıdakileri yapmanız gerekir:

  1. Keras oluştur TensorBoard geri arama
  2. Bir günlük dizini belirtin
  3. Keras' için TensorBoard geri arama iletin Model.fit () .

TensorBoard, günlük dizini hiyerarşisinden günlük verilerini okur. Bu defterin olarak, kök günlük dizinidir logs/scalars bir timestamped alt dizin karakterleri eklenmiş. Zaman damgalı alt dizin, TensorBoard'u kullanırken ve modelinizi yinelerken eğitim çalıştırmalarını kolayca belirlemenizi ve seçmenizi sağlar.

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(learning_rate=0.2),
)

print("Training ... With default parameters, this takes less than 10 seconds.")
training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback],
)

print("Average test loss: ", np.average(training_history.history['loss']))
Training ... With default parameters, this takes less than 10 seconds.
Average test loss:  0.05271831926424056

TensorBoard kullanarak kaybı inceleme

Şimdi, yukarıda kullandığınız kök günlük dizinini belirterek TensorBoard'u başlatın.

TensorBoard'un kullanıcı arayüzünün dönmesi için birkaç saniye bekleyin.

%tensorboard --logdir logs/scalars

TensorBoard'un "Geçerli veri kümesi için hiçbir gösterge panosu etkin değil" mesajını görüntülediğini görebilirsiniz. Bunun nedeni, ilk günlüğe kaydetme verilerinin henüz kaydedilmemiş olmasıdır. Eğitim ilerledikçe, Keras modeli verileri günlüğe kaydetmeye başlayacaktır. TensorBoard periyodik olarak yenilenecek ve size skaler ölçümlerinizi gösterecektir. Sabırsızsanız, sağ üstteki Yenile okuna dokunabilirsiniz.

Eğitim ilerlemesini izlerken, hem eğitim hem de doğrulama kaybının nasıl hızla azaldığını ve ardından sabit kaldığını not edin. Aslında 25 çağdan sonra antrenmanı bırakabilirdin çünkü antrenman bu noktadan sonra pek gelişmedi.

Belirli veri noktalarını görmek için grafiğin üzerine gelin. Ayrıca farenizle yakınlaştırmayı veya daha fazla ayrıntı görmek için bir kısmını seçmeyi deneyebilirsiniz.

Soldaki "Çalıştır" seçicisine dikkat edin. Bir "çalışma", bir eğitim turundan bir dizi günlükleri temsil eder, bu durumda Model.fit()'in sonucu. Geliştiriciler, modellerini zaman içinde deneyip geliştirdikçe, genellikle çok sayıda çalıştırmaya sahiptir.

Belirli çalıştırmaları seçmek için Çalıştırma seçicisini kullanın veya yalnızca eğitim veya doğrulama arasından seçim yapın. Çalıştırmaları karşılaştırmak, kodunuzun hangi sürümünün sorununuzu daha iyi çözdüğünü değerlendirmenize yardımcı olacaktır.

Tamam, TensorBoard'un kayıp grafiği, kaybın hem eğitim hem de doğrulama için sürekli olarak azaldığını ve ardından stabilize olduğunu gösteriyor. Bu, modelin ölçümlerinin büyük olasılıkla çok iyi olduğu anlamına gelir! Şimdi modelin gerçek hayatta nasıl davrandığını görün.

Giriş verilerini (60, 25, 2) göz önüne alındığında, y çizgisi = 0.5x + 2 elde edilmelidir (32, 14.5, 3). Model aynı fikirde mi?

print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
[[32.234306 ]
 [14.5974245]
 [ 3.0074697]]

Fena değil!

Özel skalerleri günlüğe kaydetme

Ne gibi sizin özel değerler, log istiyorsanız dinamik öğrenme hızına ? Bunu yapmak için TensorFlow Özet API'sini kullanmanız gerekir.

Regresyon modelini yeniden eğitin ve özel bir öğrenme oranı kaydedin. İşte nasıl:

  1. Kullanarak, bir dosya yazar oluştur tf.summary.create_file_writer() .
  2. Özel bir öğrenme oranı işlevi tanımlayın. Bu Keras geçilecek LearningRateScheduler callback'inde.
  3. Öğrenme oranı Fonksiyonun içerisinde kullanım tf.summary.scalar() özel öğrenme hızını oturum açmak için.
  4. LearningRateScheduler geri aramasını Model.fit() öğesine iletin.

Genelde, özel bir sayıl oturum açmak için, kullanmak gerekir tf.summary.scalar() bir dosya yazar ile. Dosya yazar belirtilen dizine bu çalışma için veri yazma sorumludur ve kullandığınızda örtülü kullanılır tf.summary.scalar() .

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()

def lr_schedule(epoch):
  """
  Returns a custom learning rate that decreases as epochs progress.
  """
  learning_rate = 0.2
  if epoch > 10:
    learning_rate = 0.02
  if epoch > 20:
    learning_rate = 0.01
  if epoch > 50:
    learning_rate = 0.005

  tf.summary.scalar('learning rate', data=learning_rate, step=epoch)
  return learning_rate

lr_callback = keras.callbacks.LearningRateScheduler(lr_schedule)
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)

model = keras.models.Sequential([
    keras.layers.Dense(16, input_dim=1),
    keras.layers.Dense(1),
])

model.compile(
    loss='mse', # keras.losses.mean_squared_error
    optimizer=keras.optimizers.SGD(),
)

training_history = model.fit(
    x_train, # input
    y_train, # output
    batch_size=train_size,
    verbose=0, # Suppress chatty output; use Tensorboard instead
    epochs=100,
    validation_data=(x_test, y_test),
    callbacks=[tensorboard_callback, lr_callback],
)

TensorBoard'a tekrar bakalım.

%tensorboard --logdir logs/scalars

Eğer bir olduğuna göre, soldaki bildirim "çalışır" seçici kullanma <timestamp>/metrics koşmak. Bu çalıştırmayı seçmek, bu çalıştırma sırasında öğrenme oranının ilerlemesini doğrulamanıza olanak tanıyan bir "öğrenme oranı" grafiği görüntüler.

Ayrıca bu koşunun eğitim ve doğrulama kaybı eğrilerini önceki koşularınızla karşılaştırabilirsiniz. Ayrıca, öğrenme hızı çizelgesinin döneme bağlı olarak ayrı değerler döndürdüğünü fark edebilirsiniz, ancak öğrenme hızı grafiği düzgün görünebilir. TensorBoard, düzleştirilmemiş değerleri görmek için sıfıra çevirmeniz gerekebilecek bir yumuşatma parametresine sahiptir.

Bu model nasıl yapılır?

print(model.predict([60, 25, 2]))
# True values to compare predictions against: 
# [[32.0]
#  [14.5]
#  [ 3.0]]
[[32.234013 ]
 [14.5973015]
 [ 3.0074618]]