Keras Tuner の基礎

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

TensorFlow.org で表示 Google Colab で実行 GitHub でソースを表示 ノートブックをダウンロード

概要

Keras Tuner は、TensorFlow プログラム向けに最適なハイパーパラメータを選択するためのライブラリです。ユーザーの機械学習(ML)アプリケーションに適切なハイパーパラメータを選択するためのプロセスは、ハイパーパラメータチューニングまたはハイパーチューニングと呼ばれます。

ハイパーパラメータは、ML のトレーニングプロセスとトポロジーを管理する変数です。これらの変数はトレーニングプロセス中、一貫して定数を維持し、ML プログラムのパフォーマンスに直接影響を与えます。ハイパーパラメータには、以下の 2 種類があります。

  1. モデルハイパーパラメータ: 非表示レイヤーの数と幅などのモデルの選択に影響します。
  2. アルゴリズムハイパーパラメータ: 確率的勾配降下法 (SGD) の学習率や k 最近傍 (KNN) 分類器の最近傍の数など、学習アルゴリズムの速度と質に影響します。

このチュートリアルでは、Keras Tuner を使用して、画像分類アプリケーションのハイパーチューニングを実施します。

セットアップ

import tensorflow as tf
from tensorflow import keras
2022-08-09 01:46:22.406317: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2022-08-09 01:46:23.102036: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvrtc.so.11.1: cannot open shared object file: No such file or directory
2022-08-09 01:46:23.102283: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvrtc.so.11.1: cannot open shared object file: No such file or directory
2022-08-09 01:46:23.102295: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.

Keras Tuner をインストールしてインポートします。

pip install -q -U keras-tuner
import keras_tuner as kt

データセットをダウンロードして準備する

このチュートリアルでは、Keras Tuner を使用して、Fashion MNIST データセットの服飾の画像を分類する学習モデル向けに最適なハイパーパラメータを見つけます。

データを読み込みます。

(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()
# Normalize pixel values between 0 and 1
img_train = img_train.astype('float32') / 255.0
img_test = img_test.astype('float32') / 255.0

モデルを定義する

ハイパーチューニングを行うモデルを構築する際、モデルアーキテクチャのほかにハイパーパラメータ検索空間も定義します。ハイパーチューニング用にセットアップするモデルをハイパーモデルと呼びます。

ハイパーモデルの定義は、以下の 2 つの方法で行います。

  • モデルビルダー関数を使用する
  • Keras Tuner API の HyperModel クラスをサブクラス化する

また、コンピュータビジョンアプリケーション用の HyperXceptionHyperResNet という 2 つの事前定義済みの HyperModel クラスも使用します。

このチュートリアルでは、モデルビルダー関数を使用して、画像分類モデルを定義します。モデルビルダー関数は、コンパイル済みのモデルを返し、インラインで定義するハイパーパラメータを使用してモデルをハイパーチューニングします。

def model_builder(hp):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))

  # Tune the number of units in the first Dense layer
  # Choose an optimal value between 32-512
  hp_units = hp.Int('units', min_value=32, max_value=512, step=32)
  model.add(keras.layers.Dense(units=hp_units, activation='relu'))
  model.add(keras.layers.Dense(10))

  # Tune the learning rate for the optimizer
  # Choose an optimal value from 0.01, 0.001, or 0.0001
  hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

  model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
                loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                metrics=['accuracy'])

  return model

チューナーをインスタンス化してハイパーチューニングを実行する

チューナーをインスタンス化して、ハイパーチューニングを実行します。Keras Tuner には、RandomSearchHyperbandBayesianOptimization、および Sklearn チューナーがあります。このチュートリアルでは、Hyperband チューナーを使用します。

Hyperband チューナーをインスタンス化するには、ハイパーモデル、最適化する objective、およびトレーニングするエポックの最大数 (max_epochs) を指定する必要があります。

tuner = kt.Hyperband(model_builder,
                     objective='val_accuracy',
                     max_epochs=10,
                     factor=3,
                     directory='my_dir',
                     project_name='intro_to_kt')

Hyperband チューニングアルゴリズムは、適応型リソース割り当てと早期停止を使用して、高パフォーマンスモデルに素早く収束させます。これは、トーナメント式のツリーを使用して行われます。アルゴリズムは、数回のエポックで大量のモデルをトレーニングし、性能の高い上位半数のモデル次のラウンドに持ち越します。Hyperband は、1 + logfactor(max_epochs) を計算し、直近の整数に繰り上げて、トーナメントでトレーニングするモデル数を決定します。

検証損失の特定の値に達した後、トレーニングを早期に停止するためのコールバックを作成します。

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)

ハイパーパラメータ検索を実行します。検索メソッドの引数は、上記のコールバックのほか、tf.keras.model.fit に使用される引数と同じです。

tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])

# Get the optimal hyperparameters
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]

print(f"""
The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is {best_hps.get('units')} and the optimal learning rate for the optimizer
is {best_hps.get('learning_rate')}.
""")
Trial 30 Complete [00h 00m 36s]
val_accuracy: 0.8920000195503235

Best val_accuracy So Far: 0.8920000195503235
Total elapsed time: 00h 07m 25s
INFO:tensorflow:Oracle triggered exit

The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is 320 and the optimal learning rate for the optimizer
is 0.001.

モデルをトレーニングする

検索から取得したハイパーパラメータを使用してモデルをトレーニングするための最適なエポック数を見つけます。

# Build the model with the optimal hyperparameters and train it on the data for 50 epochs
model = tuner.hypermodel.build(best_hps)
history = model.fit(img_train, label_train, epochs=50, validation_split=0.2)

val_acc_per_epoch = history.history['val_accuracy']
best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
print('Best epoch: %d' % (best_epoch,))
Epoch 1/50
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4949 - accuracy: 0.8243 - val_loss: 0.4229 - val_accuracy: 0.8403
Epoch 2/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3710 - accuracy: 0.8654 - val_loss: 0.3623 - val_accuracy: 0.8690
Epoch 3/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3323 - accuracy: 0.8783 - val_loss: 0.3439 - val_accuracy: 0.8748
Epoch 4/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3087 - accuracy: 0.8851 - val_loss: 0.3400 - val_accuracy: 0.8773
Epoch 5/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2879 - accuracy: 0.8927 - val_loss: 0.3282 - val_accuracy: 0.8823
Epoch 6/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2731 - accuracy: 0.8997 - val_loss: 0.3432 - val_accuracy: 0.8789
Epoch 7/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2580 - accuracy: 0.9045 - val_loss: 0.3434 - val_accuracy: 0.8776
Epoch 8/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2469 - accuracy: 0.9079 - val_loss: 0.3237 - val_accuracy: 0.8878
Epoch 9/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2374 - accuracy: 0.9117 - val_loss: 0.3324 - val_accuracy: 0.8842
Epoch 10/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2280 - accuracy: 0.9136 - val_loss: 0.3740 - val_accuracy: 0.8758
Epoch 11/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2180 - accuracy: 0.9183 - val_loss: 0.3664 - val_accuracy: 0.8813
Epoch 12/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2114 - accuracy: 0.9204 - val_loss: 0.3430 - val_accuracy: 0.8870
Epoch 13/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2023 - accuracy: 0.9237 - val_loss: 0.3244 - val_accuracy: 0.8915
Epoch 14/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1946 - accuracy: 0.9259 - val_loss: 0.3210 - val_accuracy: 0.8936
Epoch 15/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1856 - accuracy: 0.9297 - val_loss: 0.3371 - val_accuracy: 0.8915
Epoch 16/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1831 - accuracy: 0.9310 - val_loss: 0.3362 - val_accuracy: 0.8906
Epoch 17/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1762 - accuracy: 0.9333 - val_loss: 0.3404 - val_accuracy: 0.8903
Epoch 18/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1697 - accuracy: 0.9364 - val_loss: 0.3834 - val_accuracy: 0.8865
Epoch 19/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1631 - accuracy: 0.9387 - val_loss: 0.3512 - val_accuracy: 0.8925
Epoch 20/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1594 - accuracy: 0.9395 - val_loss: 0.3534 - val_accuracy: 0.8972
Epoch 21/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1531 - accuracy: 0.9430 - val_loss: 0.3710 - val_accuracy: 0.8874
Epoch 22/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1506 - accuracy: 0.9425 - val_loss: 0.3543 - val_accuracy: 0.8931
Epoch 23/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1470 - accuracy: 0.9449 - val_loss: 0.3750 - val_accuracy: 0.8923
Epoch 24/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1438 - accuracy: 0.9469 - val_loss: 0.4016 - val_accuracy: 0.8889
Epoch 25/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1375 - accuracy: 0.9479 - val_loss: 0.3679 - val_accuracy: 0.8964
Epoch 26/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1356 - accuracy: 0.9489 - val_loss: 0.3783 - val_accuracy: 0.8966
Epoch 27/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1284 - accuracy: 0.9519 - val_loss: 0.3913 - val_accuracy: 0.8928
Epoch 28/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1245 - accuracy: 0.9530 - val_loss: 0.3845 - val_accuracy: 0.8950
Epoch 29/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1237 - accuracy: 0.9547 - val_loss: 0.4416 - val_accuracy: 0.8838
Epoch 30/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1218 - accuracy: 0.9538 - val_loss: 0.4087 - val_accuracy: 0.8929
Epoch 31/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1150 - accuracy: 0.9570 - val_loss: 0.4218 - val_accuracy: 0.8946
Epoch 32/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1112 - accuracy: 0.9578 - val_loss: 0.4176 - val_accuracy: 0.8928
Epoch 33/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1126 - accuracy: 0.9575 - val_loss: 0.4237 - val_accuracy: 0.8913
Epoch 34/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1068 - accuracy: 0.9601 - val_loss: 0.4355 - val_accuracy: 0.8894
Epoch 35/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1047 - accuracy: 0.9599 - val_loss: 0.4332 - val_accuracy: 0.8888
Epoch 36/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1058 - accuracy: 0.9599 - val_loss: 0.4322 - val_accuracy: 0.8928
Epoch 37/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1019 - accuracy: 0.9621 - val_loss: 0.4384 - val_accuracy: 0.8914
Epoch 38/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0976 - accuracy: 0.9647 - val_loss: 0.4420 - val_accuracy: 0.8958
Epoch 39/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0961 - accuracy: 0.9634 - val_loss: 0.4305 - val_accuracy: 0.8970
Epoch 40/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0958 - accuracy: 0.9642 - val_loss: 0.4737 - val_accuracy: 0.8912
Epoch 41/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0897 - accuracy: 0.9662 - val_loss: 0.4588 - val_accuracy: 0.8944
Epoch 42/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0872 - accuracy: 0.9671 - val_loss: 0.4853 - val_accuracy: 0.8900
Epoch 43/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0890 - accuracy: 0.9669 - val_loss: 0.5023 - val_accuracy: 0.8942
Epoch 44/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0871 - accuracy: 0.9674 - val_loss: 0.4815 - val_accuracy: 0.8913
Epoch 45/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0861 - accuracy: 0.9679 - val_loss: 0.5725 - val_accuracy: 0.8858
Epoch 46/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0847 - accuracy: 0.9678 - val_loss: 0.4909 - val_accuracy: 0.8920
Epoch 47/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0834 - accuracy: 0.9685 - val_loss: 0.5719 - val_accuracy: 0.8864
Epoch 48/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0790 - accuracy: 0.9702 - val_loss: 0.5013 - val_accuracy: 0.8917
Epoch 49/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0771 - accuracy: 0.9711 - val_loss: 0.5037 - val_accuracy: 0.8961
Epoch 50/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0774 - accuracy: 0.9707 - val_loss: 0.5199 - val_accuracy: 0.8982
Best epoch: 50

ハイパーモデルを再インスタンス化し、前述の最適なエポック数でトレーニングします。

hypermodel = tuner.hypermodel.build(best_hps)

# Retrain the model
hypermodel.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)
Epoch 1/50
1500/1500 [==============================] - 4s 2ms/step - loss: 0.4949 - accuracy: 0.8263 - val_loss: 0.4074 - val_accuracy: 0.8476
Epoch 2/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3713 - accuracy: 0.8650 - val_loss: 0.3690 - val_accuracy: 0.8680
Epoch 3/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3333 - accuracy: 0.8783 - val_loss: 0.3525 - val_accuracy: 0.8717
Epoch 4/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.3068 - accuracy: 0.8873 - val_loss: 0.3582 - val_accuracy: 0.8740
Epoch 5/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2878 - accuracy: 0.8935 - val_loss: 0.3471 - val_accuracy: 0.8705
Epoch 6/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2742 - accuracy: 0.8997 - val_loss: 0.3120 - val_accuracy: 0.8887
Epoch 7/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2587 - accuracy: 0.9034 - val_loss: 0.3067 - val_accuracy: 0.8917
Epoch 8/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2471 - accuracy: 0.9073 - val_loss: 0.3183 - val_accuracy: 0.8875
Epoch 9/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2347 - accuracy: 0.9121 - val_loss: 0.3461 - val_accuracy: 0.8798
Epoch 10/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2271 - accuracy: 0.9139 - val_loss: 0.3234 - val_accuracy: 0.8899
Epoch 11/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2170 - accuracy: 0.9188 - val_loss: 0.3162 - val_accuracy: 0.8904
Epoch 12/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2124 - accuracy: 0.9211 - val_loss: 0.3217 - val_accuracy: 0.8917
Epoch 13/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.2001 - accuracy: 0.9240 - val_loss: 0.3328 - val_accuracy: 0.8867
Epoch 14/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1969 - accuracy: 0.9253 - val_loss: 0.3239 - val_accuracy: 0.8963
Epoch 15/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1889 - accuracy: 0.9285 - val_loss: 0.3320 - val_accuracy: 0.8894
Epoch 16/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1828 - accuracy: 0.9324 - val_loss: 0.3241 - val_accuracy: 0.8950
Epoch 17/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1742 - accuracy: 0.9347 - val_loss: 0.3484 - val_accuracy: 0.8898
Epoch 18/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1713 - accuracy: 0.9363 - val_loss: 0.3373 - val_accuracy: 0.8924
Epoch 19/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1645 - accuracy: 0.9377 - val_loss: 0.3465 - val_accuracy: 0.8913
Epoch 20/50
1500/1500 [==============================] - 4s 2ms/step - loss: 0.1605 - accuracy: 0.9398 - val_loss: 0.3671 - val_accuracy: 0.8876
Epoch 21/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1557 - accuracy: 0.9407 - val_loss: 0.3509 - val_accuracy: 0.8933
Epoch 22/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1513 - accuracy: 0.9426 - val_loss: 0.3638 - val_accuracy: 0.8959
Epoch 23/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1457 - accuracy: 0.9454 - val_loss: 0.3647 - val_accuracy: 0.8922
Epoch 24/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1413 - accuracy: 0.9465 - val_loss: 0.3627 - val_accuracy: 0.8932
Epoch 25/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1389 - accuracy: 0.9489 - val_loss: 0.3607 - val_accuracy: 0.8939
Epoch 26/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1362 - accuracy: 0.9487 - val_loss: 0.3880 - val_accuracy: 0.8953
Epoch 27/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1291 - accuracy: 0.9520 - val_loss: 0.3722 - val_accuracy: 0.8957
Epoch 28/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1282 - accuracy: 0.9510 - val_loss: 0.3959 - val_accuracy: 0.8903
Epoch 29/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1254 - accuracy: 0.9525 - val_loss: 0.3967 - val_accuracy: 0.8889
Epoch 30/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1201 - accuracy: 0.9550 - val_loss: 0.4029 - val_accuracy: 0.8939
Epoch 31/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1164 - accuracy: 0.9563 - val_loss: 0.4180 - val_accuracy: 0.8906
Epoch 32/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1125 - accuracy: 0.9568 - val_loss: 0.4208 - val_accuracy: 0.8953
Epoch 33/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1123 - accuracy: 0.9577 - val_loss: 0.4204 - val_accuracy: 0.8942
Epoch 34/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1086 - accuracy: 0.9590 - val_loss: 0.4428 - val_accuracy: 0.8903
Epoch 35/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1083 - accuracy: 0.9599 - val_loss: 0.4387 - val_accuracy: 0.8928
Epoch 36/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1062 - accuracy: 0.9596 - val_loss: 0.4413 - val_accuracy: 0.8935
Epoch 37/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.1017 - accuracy: 0.9616 - val_loss: 0.4446 - val_accuracy: 0.8920
Epoch 38/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0988 - accuracy: 0.9629 - val_loss: 0.4506 - val_accuracy: 0.8875
Epoch 39/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0986 - accuracy: 0.9623 - val_loss: 0.4748 - val_accuracy: 0.8909
Epoch 40/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0953 - accuracy: 0.9638 - val_loss: 0.4407 - val_accuracy: 0.8928
Epoch 41/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0916 - accuracy: 0.9652 - val_loss: 0.4495 - val_accuracy: 0.8951
Epoch 42/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0905 - accuracy: 0.9657 - val_loss: 0.4788 - val_accuracy: 0.8933
Epoch 43/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0885 - accuracy: 0.9676 - val_loss: 0.4739 - val_accuracy: 0.8938
Epoch 44/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0893 - accuracy: 0.9659 - val_loss: 0.4858 - val_accuracy: 0.8925
Epoch 45/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0826 - accuracy: 0.9691 - val_loss: 0.5108 - val_accuracy: 0.8908
Epoch 46/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0830 - accuracy: 0.9688 - val_loss: 0.5059 - val_accuracy: 0.8941
Epoch 47/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0847 - accuracy: 0.9675 - val_loss: 0.5012 - val_accuracy: 0.8968
Epoch 48/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0806 - accuracy: 0.9694 - val_loss: 0.5132 - val_accuracy: 0.8947
Epoch 49/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0768 - accuracy: 0.9713 - val_loss: 0.5131 - val_accuracy: 0.8933
Epoch 50/50
1500/1500 [==============================] - 3s 2ms/step - loss: 0.0793 - accuracy: 0.9707 - val_loss: 0.4908 - val_accuracy: 0.8965
<keras.callbacks.History at 0x7f8e27ced760>

このチュートリアルを終了するには、テストデータでハイパーモデルを評価します。

eval_result = hypermodel.evaluate(img_test, label_test)
print("[test loss, test accuracy]:", eval_result)
313/313 [==============================] - 1s 2ms/step - loss: 0.5590 - accuracy: 0.8934
[test loss, test accuracy]: [0.5589770674705505, 0.8934000134468079]

my_dir/intro_to_kt ディレクトリには、ハイパーパラメータ検索中に実行された各トライアル(モデル構成)の詳細なログとチェックポイントが含まれます。ハイパーパラメータ検索を再実行する場合、Keras Tuner は、これらのログの既存の状態を使用して、検索を再開します。この動作を無効にするには、チューナーをインスタンス化する際に、overwrite = True 引数を追加で渡してください。

まとめ

このチュートリアルでは、Keras Tuner の使用して、モデルのハイパーパラメータを調整する方法を学習しました。Keras Tuner の調査委については、以下のその他のリソースをご覧ください。

また、モデルのハイパーパラメータを対話式で調整できる、TensorBoard の HParams Dashboard もご覧ください。