![]() |
![]() |
![]() |
![]() |
概要
Keras Tuner は、TensorFlow プログラム向けに最適なハイパーパラメータを選択するためのライブラリです。ユーザーの機械学習(ML)アプリケーションに適切なハイパーパラメータを選択するためのプロセスは、ハイパーパラメータチューニングまたはハイパーチューニングと呼ばれます。
ハイパーパラメータは、ML のトレーニングプロセスとトポロジーを管理する変数です。これらの変数はトレーニングプロセス中、一貫して定数を維持し、ML プログラムのパフォーマンスに直接影響を与えます。ハイパーパラメータには、以下の 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
クラスをサブクラス化する
また、コンピュータビジョンアプリケーション用の HyperXception と HyperResNet という 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 には、RandomSearch
、Hyperband
、BayesianOptimization
、および 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 もご覧ください。