HParams Dashboard ile Hiperparametre Ayarı

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

Makine öğrenme modellerini oluştururken, çeşitli seçmeniz gerekir hyperparameters böyle bir tabakada ayrılma oranı veya öğrenim oranı gibi. Bu kararlar, doğruluk gibi model ölçümlerini etkiler. Bu nedenle, makine öğrenimi iş akışındaki önemli bir adım, probleminiz için genellikle deneme içeren en iyi hiper parametreleri belirlemektir. Bu işlem "Hiperparametre Optimizasyonu" veya "Hiperparametre Ayarlama" olarak bilinir.

TensorBoard'daki HParams panosu, en iyi deneyi veya en umut verici hiperparametre setlerini belirleme sürecine yardımcı olacak birkaç araç sağlar.

Bu eğitimde aşağıdaki adımlara odaklanılacaktır:

  1. Deneme kurulumu ve HParams özeti
  2. Hiperparametreleri ve ölçümleri günlüğe kaydetmek için TensorFlow çalıştırmalarını uyarlayın
  3. Çalıştırmayı başlatın ve hepsini tek bir üst dizine kaydedin
  4. Sonuçları TensorBoard'un HParams panosunda görselleştirin

TF 2.0'ı yükleyerek ve TensorBoard dizüstü bilgisayar uzantısını yükleyerek başlayın:

# Load the TensorBoard notebook extension
%load_ext tensorboard
# Clear any logs from previous runs
rm -rf ./logs/

TensorFlow ve TensorBoard HParams eklentisini içe aktarın:

import tensorflow as tf
from tensorboard.plugins.hparams import api as hp

İndir FashionMNIST veri kümesini ve ölçek:

fashion_mnist = tf.keras.datasets.fashion_mnist

(x_train, y_train),(x_test, y_test) = fashion_mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

1. Deney kurulumu ve HParams deney özeti

Modelde üç hiper parametre ile deney yapın:

  1. İlk yoğun katmandaki birim sayısı
  2. Bırakma katmanındaki bırakma oranı
  3. Optimize Edici

Denenecek değerleri listeleyin ve bir deney yapılandırmasını TensorBoard'a kaydedin. Bu adım isteğe bağlıdır: Kullanıcı arabiriminde hiperparametrelerin daha hassas filtrelenmesini sağlamak için alan bilgisi sağlayabilir ve hangi metriklerin görüntüleneceğini belirleyebilirsiniz.

HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))

METRIC_ACCURACY = 'accuracy'

with tf.summary.create_file_writer('logs/hparam_tuning').as_default():
  hp.hparams_config(
    hparams=[HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER],
    metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],
  )

Bu adımı atlamak seçerseniz aksi bir kullanırsınız yerde, bir dize kullanabilirsiniz HParam örn: değeri hparams['dropout'] yerine hparams[HP_DROPOUT] .

2. Hiperparametreleri ve ölçümleri günlüğe kaydetmek için TensorFlow çalıştırmalarını uyarlayın

Model oldukça basit olacaktır: aralarında bir bırakma katmanı olan iki yoğun katman. Hiperparametreler artık sabit kodlanmış olmasa da eğitim kodu tanıdık gelecektir. Bunun yerine, hyperparameters bir verilmektedir hparams sözlük ve eğitim fonksiyonu boyunca kullanılan:

def train_test_model(hparams):
  model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(hparams[HP_NUM_UNITS], activation=tf.nn.relu),
    tf.keras.layers.Dropout(hparams[HP_DROPOUT]),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax),
  ])
  model.compile(
      optimizer=hparams[HP_OPTIMIZER],
      loss='sparse_categorical_crossentropy',
      metrics=['accuracy'],
  )

  model.fit(x_train, y_train, epochs=1) # Run with 1 epoch to speed things up for demo purposes
  _, accuracy = model.evaluate(x_test, y_test)
  return accuracy

Her çalıştırma için, hiperparametreler ve nihai doğruluk ile bir hparams özetini günlüğe kaydedin:

def run(run_dir, hparams):
  with tf.summary.create_file_writer(run_dir).as_default():
    hp.hparams(hparams)  # record the values used in this trial
    accuracy = train_test_model(hparams)
    tf.summary.scalar(METRIC_ACCURACY, accuracy, step=1)

Keras modellerini eğitirken, bunları doğrudan yazmak yerine geri aramaları kullanabilirsiniz:

model.fit(
    ...,
    callbacks=[
        tf.keras.callbacks.TensorBoard(logdir),  # log metrics
        hp.KerasCallback(logdir, hparams),  # log hparams
    ],
)

3. Çalıştırmayı başlatın ve hepsini tek bir üst dizine kaydedin

Artık birden çok deneyi deneyebilir, her birini farklı bir hiperparametre seti ile eğitebilirsiniz.

Basit olması için bir ızgara araması kullanın: ayrık parametrelerin tüm kombinasyonlarını ve gerçek değerli parametrenin yalnızca alt ve üst sınırlarını deneyin. Daha karmaşık senaryolar için, her bir hiperparametre değerini rastgele seçmek daha etkili olabilir (buna rastgele arama denir). Kullanılabilecek daha gelişmiş yöntemler var.

Birkaç dakika sürecek birkaç deney yapın:

session_num = 0

for num_units in HP_NUM_UNITS.domain.values:
  for dropout_rate in (HP_DROPOUT.domain.min_value, HP_DROPOUT.domain.max_value):
    for optimizer in HP_OPTIMIZER.domain.values:
      hparams = {
          HP_NUM_UNITS: num_units,
          HP_DROPOUT: dropout_rate,
          HP_OPTIMIZER: optimizer,
      }
      run_name = "run-%d" % session_num
      print('--- Starting trial: %s' % run_name)
      print({h.name: hparams[h] for h in hparams})
      run('logs/hparam_tuning/' + run_name, hparams)
      session_num += 1
--- Starting trial: run-0
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 62us/sample - loss: 0.6872 - accuracy: 0.7564
10000/10000 [==============================] - 0s 35us/sample - loss: 0.4806 - accuracy: 0.8321
--- Starting trial: run-1
{'num_units': 16, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9428 - accuracy: 0.6769
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6519 - accuracy: 0.7770
--- Starting trial: run-2
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 60us/sample - loss: 0.8158 - accuracy: 0.7078
10000/10000 [==============================] - 0s 36us/sample - loss: 0.5309 - accuracy: 0.8154
--- Starting trial: run-3
{'num_units': 16, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 50us/sample - loss: 1.1465 - accuracy: 0.6019
10000/10000 [==============================] - 0s 36us/sample - loss: 0.7007 - accuracy: 0.7683
--- Starting trial: run-4
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 65us/sample - loss: 0.6178 - accuracy: 0.7849
10000/10000 [==============================] - 0s 38us/sample - loss: 0.4645 - accuracy: 0.8395
--- Starting trial: run-5
{'num_units': 32, 'dropout': 0.1, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 55us/sample - loss: 0.8989 - accuracy: 0.6896
10000/10000 [==============================] - 0s 37us/sample - loss: 0.6335 - accuracy: 0.7853
--- Starting trial: run-6
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'adam'}
60000/60000 [==============================] - 4s 64us/sample - loss: 0.6404 - accuracy: 0.7782
10000/10000 [==============================] - 0s 37us/sample - loss: 0.4802 - accuracy: 0.8265
--- Starting trial: run-7
{'num_units': 32, 'dropout': 0.2, 'optimizer': 'sgd'}
60000/60000 [==============================] - 3s 54us/sample - loss: 0.9633 - accuracy: 0.6703
10000/10000 [==============================] - 0s 36us/sample - loss: 0.6516 - accuracy: 0.7755

4. Sonuçları TensorBoard'un HParams eklentisinde görselleştirin

HParams panosu artık açılabilir. TensorBoard'u başlatın ve en üstteki "HParams" üzerine tıklayın.

%tensorboard --logdir logs/hparam_tuning

Panonun sol bölmesi, HParams panosundaki tüm görünümlerde etkin olan filtreleme yetenekleri sağlar:

  • Gösterge tablosunda hangi hiperparametrelerin/metriklerin gösterileceğini filtreleyin
  • Gösterge tablosunda hangi hiper parametre/metrik değerlerinin gösterileceğini filtreleyin
  • Çalışma durumuna göre filtreleyin (çalışıyor, başarı, ...)
  • Tablo görünümünde hiperparametreye/metriğe göre sırala
  • Gösterilecek oturum gruplarının sayısı (çok sayıda deney olduğunda performans için kullanışlıdır)

HParams panosu, çeşitli yararlı bilgiler içeren üç farklı görünüme sahiptir:

  • Tablo Görünümü ishal, onların hyperparameters ve bunların ölçümlerini listeler.
  • Paralel Koordinatlar Görüntüle her hyperparemeter ve metrik için bir eksen geçiyor bir çizgi olarak her çalıştırmak gösterir. Yalnızca içinden geçen koşuları vurgulayacak bir bölgeyi işaretlemek için fareyi herhangi bir eksende tıklayıp sürükleyin. Bu, hangi hiperparametre gruplarının en önemli olduğunu belirlemek için faydalı olabilir. Eksenlerin kendileri, sürüklenerek yeniden sıralanabilir.
  • Her bir metrik ile metrik her hyperparameter / karşılaştıran Dağılım Grafiği Görüntüle gösterileri araziler. Bu, korelasyonları belirlemeye yardımcı olabilir. Belirli bir çizimde bir bölge seçmek için tıklayın ve sürükleyin ve diğer çizimlerde bu oturumları vurgulayın.

Bir tablo satırı, bir paralel koordinat çizgisi ve bir dağılım grafiği pazarı tıklanarak o oturum için eğitim adımlarının bir fonksiyonu olarak metriklerin bir grafiğini görebilirsiniz (bu eğitimde her çalıştırma için yalnızca bir adım kullanılmasına rağmen).

HParams panosunun yeteneklerini daha fazla keşfetmek için, daha fazla deney içeren bir dizi önceden oluşturulmuş günlük indirin:

wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'
unzip -q hparams_demo_logs.zip -d logs/hparam_demo

Bu günlükleri TensorBoard'da görüntüleyin:

%tensorboard --logdir logs/hparam_demo

HParams panosundaki farklı görünümleri deneyebilirsiniz.

Örneğin, paralel koordinatlar görünümüne giderek ve doğruluk eksenine tıklayıp sürükleyerek, en yüksek doğruluktaki koşuları seçebilirsiniz. Bu çalıştırmalar optimize edici ekseninde "adam"dan geçerken, bu deneylerde "adam"ın "sgd"den daha iyi performans gösterdiği sonucuna varabilirsiniz.