![]() | ![]() | ![]() | ![]() |
Ketika membangun belajar mesin model, Anda perlu memilih berbagai hyperparameters , seperti angka putus sekolah di lapisan atau tingkat pembelajaran. Keputusan ini memengaruhi metrik model, seperti akurasi. Oleh karena itu, langkah penting dalam alur kerja pembelajaran mesin adalah mengidentifikasi hyperparameter terbaik untuk masalah Anda, yang sering kali melibatkan eksperimen. Proses ini dikenal sebagai "Optimasi Hyperparameter" atau "Penyetelan Hyperparameter".
Dasbor HParams di TensorBoard menyediakan beberapa alat untuk membantu proses mengidentifikasi eksperimen terbaik atau kumpulan hyperparameter yang paling menjanjikan ini.
Tutorial ini akan fokus pada langkah-langkah berikut:
- Penyiapan eksperimen dan ringkasan HParams
- Menyesuaikan proses TensorFlow untuk mencatat hyperparameter dan metrik
- Mulai jalankan dan catat semuanya di bawah satu direktori induk
- Visualisasikan hasilnya di dasbor HParams TensorBoard
Mulailah dengan menginstal TF 2.0 dan memuat ekstensi notebook TensorBoard:
# Load the TensorBoard notebook extension
%load_ext tensorboard
# Clear any logs from previous runs
rm -rf ./logs/
Impor TensorFlow dan plugin TensorBoard HParams:
import tensorflow as tf
from tensorboard.plugins.hparams import api as hp
Download FashionMNIST dataset dan skala itu:
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. Pengaturan percobaan dan ringkasan percobaan HParams
Percobaan dengan tiga hyperparameter dalam model:
- Jumlah unit di lapisan padat pertama
- Tingkat putus sekolah di lapisan putus sekolah
- Pengoptimal
Cantumkan nilai untuk dicoba, dan buat log konfigurasi eksperimen ke TensorBoard. Langkah ini opsional: Anda dapat memberikan informasi domain untuk mengaktifkan pemfilteran hiperparameter yang lebih tepat di UI, dan Anda dapat menentukan metrik mana yang harus ditampilkan.
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')],
)
Jika Anda memilih untuk melewatkan langkah ini, Anda dapat menggunakan literal string yang mana pun Anda sebaliknya akan menggunakan HParam
nilai: misalnya, hparams['dropout']
bukan hparams[HP_DROPOUT]
.
2. Menyesuaikan proses TensorFlow untuk mencatat hyperparameter dan metrik
Modelnya akan sangat sederhana: dua lapisan padat dengan lapisan putus-putus di antaranya. Kode pelatihan akan terlihat familier, meskipun hyperparameters tidak lagi di-hardcode. Sebaliknya, hyperparameters disediakan dalam hparams
kamus dan digunakan di seluruh fungsi pelatihan:
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
Untuk setiap proses, catat ringkasan hparams dengan hyperparameters dan akurasi akhir:
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)
Saat melatih model Keras, Anda dapat menggunakan callback alih-alih menulis ini secara langsung:
model.fit(
...,
callbacks=[
tf.keras.callbacks.TensorBoard(logdir), # log metrics
hp.KerasCallback(logdir, hparams), # log hparams
],
)
3. Mulai jalankan dan catat semuanya di bawah satu direktori induk
Sekarang Anda dapat mencoba beberapa eksperimen, melatih masing-masing eksperimen dengan kumpulan hyperparameter yang berbeda.
Untuk mempermudah, gunakan pencarian kisi: coba semua kombinasi parameter diskrit dan hanya batas bawah dan atas dari parameter bernilai nyata. Untuk skenario yang lebih kompleks, mungkin lebih efektif untuk memilih setiap nilai hyperparameter secara acak (ini disebut pencarian acak). Ada metode yang lebih canggih yang dapat digunakan.
Jalankan beberapa eksperimen, yang akan memakan waktu beberapa menit:
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. Visualisasikan hasilnya di plugin HParams TensorBoard
Dasbor HParams sekarang dapat dibuka. Mulai TensorBoard dan klik "HParams" di bagian atas.
%tensorboard --logdir logs/hparam_tuning
Panel kiri dasbor menyediakan kemampuan pemfilteran yang aktif di semua tampilan di dasbor HParams:
- Filter hyperparameter/metrik mana yang ditampilkan di dasbor
- Filter nilai hyperparameter/metrik mana yang ditampilkan di dasbor
- Filter status berjalan (berjalan, sukses, ...)
- Urutkan berdasarkan hyperparameter/metrik dalam tampilan tabel
- Jumlah grup sesi yang akan ditampilkan (berguna untuk performa saat ada banyak eksperimen)
Dasbor HParams memiliki tiga tampilan berbeda, dengan berbagai informasi berguna:
- The Table View daftar berjalan, hyperparameters mereka, dan metrik mereka.
- Paralel Koordinat View menunjukkan masing-masing berjalan sebagai garis akan melalui sumbu untuk setiap hyperparemeter dan metrik. Klik dan seret mouse pada sumbu mana pun untuk menandai wilayah yang hanya akan menyorot lintasan yang melewatinya. Ini dapat berguna untuk mengidentifikasi kelompok hyperparameter mana yang paling penting. Sumbu itu sendiri dapat diatur ulang dengan menyeretnya.
- The Scatter Plot View menunjukkan plot membandingkan setiap hyperparameter / metrik dengan setiap metrik. Ini dapat membantu mengidentifikasi korelasi. Klik dan seret untuk memilih wilayah dalam plot tertentu dan sorot sesi tersebut di seluruh plot lainnya.
Baris tabel, garis koordinat paralel, dan pasar plot sebar dapat diklik untuk melihat plot metrik sebagai fungsi dari langkah-langkah pelatihan untuk sesi tersebut (walaupun dalam tutorial ini hanya satu langkah yang digunakan untuk setiap proses).
Untuk menjelajahi lebih lanjut kemampuan dasbor HParams, unduh satu set log yang dibuat sebelumnya dengan lebih banyak eksperimen:
wget -q 'https://storage.googleapis.com/download.tensorflow.org/tensorboard/hparams_demo_logs.zip'
unzip -q hparams_demo_logs.zip -d logs/hparam_demo
Lihat log ini di TensorBoard:
%tensorboard --logdir logs/hparam_demo
Anda dapat mencoba tampilan berbeda di dasbor HParams.
Misalnya, dengan membuka tampilan koordinat paralel dan mengklik serta menyeret sumbu akurasi, Anda dapat memilih lintasan dengan akurasi tertinggi. Saat proses ini melewati 'adam' di sumbu pengoptimal, Anda dapat menyimpulkan bahwa 'adam' berkinerja lebih baik daripada 'sgd' pada eksperimen ini.