View on TensorFlow.org
|
Run in Google Colab
|
View source on GitHub
|
Download notebook
|
Overview
The Keras Tuner is a library that helps you pick the optimal set of hyperparameters for your TensorFlow program. The process of selecting the right set of hyperparameters for your machine learning (ML) application is called hyperparameter tuning or hypertuning.
Hyperparameters are the variables that govern the training process and the topology of an ML model. These variables remain constant over the training process and directly impact the performance of your ML program. Hyperparameters are of two types:
- Model hyperparameters which influence model selection such as the number and width of hidden layers
- Algorithm hyperparameters which influence the speed and quality of the learning algorithm such as the learning rate for Stochastic Gradient Descent (SGD) and the number of nearest neighbors for a k Nearest Neighbors (KNN) classifier
In this tutorial, you will use the Keras Tuner to perform hypertuning for an image classification application.
Setup
import tensorflow as tf
from tensorflow import keras
Install and import the Keras Tuner.
pip install -q -U keras-tunerimport keras_tuner as kt
Download and prepare the dataset
In this tutorial, you will use the Keras Tuner to find the best hyperparameters for a machine learning model that classifies images of clothing from the Fashion MNIST dataset.
Load the data.
(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
Define the model
When you build a model for hypertuning, you also define the hyperparameter search space in addition to the model architecture. The model you set up for hypertuning is called a hypermodel.
You can define a hypermodel through two approaches:
- By using a model builder function
- By subclassing the
HyperModelclass of the Keras Tuner API
You can also use two pre-defined HyperModel classes - HyperXception and HyperResNet for computer vision applications.
In this tutorial, you use a model builder function to define the image classification model. The model builder function returns a compiled model and uses hyperparameters you define inline to hypertune the model.
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
Instantiate the tuner and perform hypertuning
Instantiate the tuner to perform the hypertuning. The Keras Tuner has four tuners available - RandomSearch, Hyperband, BayesianOptimization, and Sklearn. In this tutorial, you use the Hyperband tuner.
To instantiate the Hyperband tuner, you must specify the hypermodel, the objective to optimize and the maximum number of epochs to train (max_epochs).
tuner = kt.Hyperband(model_builder,
objective='val_accuracy',
max_epochs=10,
factor=3,
directory='my_dir',
project_name='intro_to_kt')
/tmpfs/src/tf_docs_env/lib/python3.13/site-packages/keras/src/layers/reshaping/flatten.py:37: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead. super().__init__(**kwargs)
The Hyperband tuning algorithm uses adaptive resource allocation and early-stopping to quickly converge on a high-performing model. This is done using a sports championship style bracket. The algorithm trains a large number of models for a few epochs and carries forward only the top-performing half of models to the next round. Hyperband determines the number of models to train in a bracket by computing 1 + logfactor(max_epochs) and rounding it up to the nearest integer.
Create a callback to stop training early after reaching a certain value for the validation loss.
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
Run the hyperparameter search. The arguments for the search method are the same as those used for tf.keras.model.fit in addition to the callback above.
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 47s] val_accuracy: 0.890749990940094 Best val_accuracy So Far: 0.8930000066757202 Total elapsed time: 00h 10m 28s The hyperparameter search is complete. The optimal number of units in the first densely-connected layer is 480 and the optimal learning rate for the optimizer is 0.001.
Train the model
Find the optimal number of epochs to train the model with the hyperparameters obtained from the search.
# 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 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8243 - loss: 0.4927 - val_accuracy: 0.8531 - val_loss: 0.3939 Epoch 2/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8654 - loss: 0.3709 - val_accuracy: 0.8685 - val_loss: 0.3533 Epoch 3/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8770 - loss: 0.3328 - val_accuracy: 0.8777 - val_loss: 0.3441 Epoch 4/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8883 - loss: 0.3053 - val_accuracy: 0.8715 - val_loss: 0.3482 Epoch 5/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8930 - loss: 0.2882 - val_accuracy: 0.8736 - val_loss: 0.3397 Epoch 6/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8982 - loss: 0.2727 - val_accuracy: 0.8788 - val_loss: 0.3322 Epoch 7/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9039 - loss: 0.2570 - val_accuracy: 0.8814 - val_loss: 0.3370 Epoch 8/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9087 - loss: 0.2461 - val_accuracy: 0.8888 - val_loss: 0.3166 Epoch 9/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9135 - loss: 0.2339 - val_accuracy: 0.8873 - val_loss: 0.3226 Epoch 10/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9164 - loss: 0.2247 - val_accuracy: 0.8879 - val_loss: 0.3287 Epoch 11/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9197 - loss: 0.2141 - val_accuracy: 0.8909 - val_loss: 0.3270 Epoch 12/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9234 - loss: 0.2061 - val_accuracy: 0.8892 - val_loss: 0.3295 Epoch 13/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9240 - loss: 0.1991 - val_accuracy: 0.8957 - val_loss: 0.3121 Epoch 14/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9285 - loss: 0.1917 - val_accuracy: 0.8911 - val_loss: 0.3199 Epoch 15/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9286 - loss: 0.1847 - val_accuracy: 0.8889 - val_loss: 0.3321 Epoch 16/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9314 - loss: 0.1806 - val_accuracy: 0.8965 - val_loss: 0.3282 Epoch 17/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9348 - loss: 0.1727 - val_accuracy: 0.8979 - val_loss: 0.3327 Epoch 18/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9370 - loss: 0.1659 - val_accuracy: 0.8934 - val_loss: 0.3370 Epoch 19/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9393 - loss: 0.1637 - val_accuracy: 0.8924 - val_loss: 0.3594 Epoch 20/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9422 - loss: 0.1533 - val_accuracy: 0.8953 - val_loss: 0.3468 Epoch 21/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9436 - loss: 0.1504 - val_accuracy: 0.8954 - val_loss: 0.3520 Epoch 22/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9445 - loss: 0.1452 - val_accuracy: 0.8950 - val_loss: 0.3509 Epoch 23/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9465 - loss: 0.1409 - val_accuracy: 0.8900 - val_loss: 0.3724 Epoch 24/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9479 - loss: 0.1381 - val_accuracy: 0.8919 - val_loss: 0.3864 Epoch 25/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9493 - loss: 0.1327 - val_accuracy: 0.8974 - val_loss: 0.3671 Epoch 26/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9514 - loss: 0.1291 - val_accuracy: 0.8960 - val_loss: 0.3948 Epoch 27/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9521 - loss: 0.1258 - val_accuracy: 0.8909 - val_loss: 0.3980 Epoch 28/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9525 - loss: 0.1252 - val_accuracy: 0.8951 - val_loss: 0.3971 Epoch 29/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9562 - loss: 0.1191 - val_accuracy: 0.8899 - val_loss: 0.4191 Epoch 30/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9574 - loss: 0.1132 - val_accuracy: 0.8962 - val_loss: 0.3834 Epoch 31/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9579 - loss: 0.1120 - val_accuracy: 0.8924 - val_loss: 0.4119 Epoch 32/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9588 - loss: 0.1097 - val_accuracy: 0.8913 - val_loss: 0.4269 Epoch 33/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9590 - loss: 0.1067 - val_accuracy: 0.8950 - val_loss: 0.4153 Epoch 34/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9600 - loss: 0.1061 - val_accuracy: 0.8920 - val_loss: 0.4477 Epoch 35/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9605 - loss: 0.1038 - val_accuracy: 0.8929 - val_loss: 0.4493 Epoch 36/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9629 - loss: 0.1000 - val_accuracy: 0.8886 - val_loss: 0.4768 Epoch 37/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9631 - loss: 0.0993 - val_accuracy: 0.8960 - val_loss: 0.4590 Epoch 38/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9637 - loss: 0.0962 - val_accuracy: 0.8967 - val_loss: 0.4730 Epoch 39/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9658 - loss: 0.0910 - val_accuracy: 0.8917 - val_loss: 0.4724 Epoch 40/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9654 - loss: 0.0927 - val_accuracy: 0.8951 - val_loss: 0.4694 Epoch 41/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9660 - loss: 0.0894 - val_accuracy: 0.8917 - val_loss: 0.4923 Epoch 42/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9676 - loss: 0.0857 - val_accuracy: 0.8994 - val_loss: 0.4901 Epoch 43/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9686 - loss: 0.0835 - val_accuracy: 0.8878 - val_loss: 0.5240 Epoch 44/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9677 - loss: 0.0837 - val_accuracy: 0.8927 - val_loss: 0.5169 Epoch 45/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9694 - loss: 0.0832 - val_accuracy: 0.8924 - val_loss: 0.4892 Epoch 46/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9709 - loss: 0.0776 - val_accuracy: 0.8951 - val_loss: 0.5137 Epoch 47/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9705 - loss: 0.0792 - val_accuracy: 0.8888 - val_loss: 0.5718 Epoch 48/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9722 - loss: 0.0763 - val_accuracy: 0.8955 - val_loss: 0.5456 Epoch 49/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9695 - loss: 0.0814 - val_accuracy: 0.8963 - val_loss: 0.5219 Epoch 50/50 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9714 - loss: 0.0746 - val_accuracy: 0.8953 - val_loss: 0.5361 Best epoch: 42
Re-instantiate the hypermodel and train it with the optimal number of epochs from above.
hypermodel = tuner.hypermodel.build(best_hps)
# Retrain the model
hypermodel.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)
Epoch 1/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.8259 - loss: 0.4944 - val_accuracy: 0.8562 - val_loss: 0.4065 Epoch 2/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8634 - loss: 0.3684 - val_accuracy: 0.8703 - val_loss: 0.3623 Epoch 3/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8767 - loss: 0.3325 - val_accuracy: 0.8814 - val_loss: 0.3374 Epoch 4/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.8861 - loss: 0.3072 - val_accuracy: 0.8756 - val_loss: 0.3473 Epoch 5/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8925 - loss: 0.2889 - val_accuracy: 0.8742 - val_loss: 0.3556 Epoch 6/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.8980 - loss: 0.2726 - val_accuracy: 0.8876 - val_loss: 0.3083 Epoch 7/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9038 - loss: 0.2571 - val_accuracy: 0.8928 - val_loss: 0.3040 Epoch 8/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9081 - loss: 0.2448 - val_accuracy: 0.8892 - val_loss: 0.3099 Epoch 9/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9121 - loss: 0.2339 - val_accuracy: 0.8808 - val_loss: 0.3350 Epoch 10/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9170 - loss: 0.2231 - val_accuracy: 0.8857 - val_loss: 0.3231 Epoch 11/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9190 - loss: 0.2148 - val_accuracy: 0.8888 - val_loss: 0.3221 Epoch 12/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9223 - loss: 0.2083 - val_accuracy: 0.8877 - val_loss: 0.3356 Epoch 13/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9243 - loss: 0.1989 - val_accuracy: 0.8888 - val_loss: 0.3432 Epoch 14/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9281 - loss: 0.1909 - val_accuracy: 0.8948 - val_loss: 0.3078 Epoch 15/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9306 - loss: 0.1841 - val_accuracy: 0.8947 - val_loss: 0.3171 Epoch 16/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9333 - loss: 0.1781 - val_accuracy: 0.8848 - val_loss: 0.3515 Epoch 17/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9354 - loss: 0.1721 - val_accuracy: 0.8897 - val_loss: 0.3631 Epoch 18/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9375 - loss: 0.1677 - val_accuracy: 0.8918 - val_loss: 0.3421 Epoch 19/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9379 - loss: 0.1641 - val_accuracy: 0.8946 - val_loss: 0.3503 Epoch 20/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9392 - loss: 0.1596 - val_accuracy: 0.8957 - val_loss: 0.3479 Epoch 21/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9431 - loss: 0.1501 - val_accuracy: 0.8942 - val_loss: 0.3602 Epoch 22/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9456 - loss: 0.1453 - val_accuracy: 0.8967 - val_loss: 0.3681 Epoch 23/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9453 - loss: 0.1441 - val_accuracy: 0.8992 - val_loss: 0.3425 Epoch 24/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9469 - loss: 0.1397 - val_accuracy: 0.8878 - val_loss: 0.3858 Epoch 25/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9488 - loss: 0.1341 - val_accuracy: 0.8941 - val_loss: 0.3659 Epoch 26/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9519 - loss: 0.1291 - val_accuracy: 0.8940 - val_loss: 0.3780 Epoch 27/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9517 - loss: 0.1282 - val_accuracy: 0.8931 - val_loss: 0.4064 Epoch 28/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9517 - loss: 0.1262 - val_accuracy: 0.8928 - val_loss: 0.4119 Epoch 29/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9554 - loss: 0.1184 - val_accuracy: 0.8922 - val_loss: 0.4112 Epoch 30/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9562 - loss: 0.1170 - val_accuracy: 0.8952 - val_loss: 0.3910 Epoch 31/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9582 - loss: 0.1129 - val_accuracy: 0.8922 - val_loss: 0.4179 Epoch 32/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9580 - loss: 0.1103 - val_accuracy: 0.8923 - val_loss: 0.4191 Epoch 33/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9594 - loss: 0.1093 - val_accuracy: 0.8937 - val_loss: 0.4253 Epoch 34/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9587 - loss: 0.1066 - val_accuracy: 0.8963 - val_loss: 0.4137 Epoch 35/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9602 - loss: 0.1049 - val_accuracy: 0.8933 - val_loss: 0.4347 Epoch 36/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9621 - loss: 0.0995 - val_accuracy: 0.8928 - val_loss: 0.4444 Epoch 37/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9627 - loss: 0.0990 - val_accuracy: 0.8933 - val_loss: 0.4532 Epoch 38/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9641 - loss: 0.0957 - val_accuracy: 0.8906 - val_loss: 0.4658 Epoch 39/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9646 - loss: 0.0954 - val_accuracy: 0.8978 - val_loss: 0.4567 Epoch 40/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9654 - loss: 0.0910 - val_accuracy: 0.8941 - val_loss: 0.4912 Epoch 41/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 4s 3ms/step - accuracy: 0.9651 - loss: 0.0920 - val_accuracy: 0.8873 - val_loss: 0.5168 Epoch 42/42 1500/1500 ━━━━━━━━━━━━━━━━━━━━ 5s 3ms/step - accuracy: 0.9659 - loss: 0.0899 - val_accuracy: 0.8933 - val_loss: 0.5086 <keras.src.callbacks.history.History at 0x7fd44844add0>
To finish this tutorial, evaluate the hypermodel on the test data.
eval_result = hypermodel.evaluate(img_test, label_test)
print("[test loss, test accuracy]:", eval_result)
313/313 ━━━━━━━━━━━━━━━━━━━━ 2s 4ms/step - accuracy: 0.8885 - loss: 0.5407 [test loss, test accuracy]: [0.5406776070594788, 0.8884999752044678]
The my_dir/intro_to_kt directory contains detailed logs and checkpoints for every trial (model configuration) run during the hyperparameter search. If you re-run the hyperparameter search, the Keras Tuner uses the existing state from these logs to resume the search. To disable this behavior, pass an additional overwrite=True argument while instantiating the tuner.
Summary
In this tutorial, you learned how to use the Keras Tuner to tune hyperparameters for a model. To learn more about the Keras Tuner, check out these additional resources:
Also check out the HParams Dashboard in TensorBoard to interactively tune your model hyperparameters.
View on TensorFlow.org
Run in Google Colab
View source on GitHub
Download notebook