Keras Tunerでハイパーパラメータ自動調整してみる

2025年6月6日金曜日

Google Colab Keras TensorFlow 画像分類 機械学習

X f B! P L
Keras Tunerでハイパーパラメータ自動調整してみる アイキャッチ画像

はじめに

Keras Tunerを使って、画像分類モデルのハイパーパラメータ(層の数、ユニット数、学習率など)を自動で最適化してみます。
人力でチューニングしていた部分を自動化することで、「最適なモデル構造」を効率的に見つけることができます!

使用する環境

  • Google Colab(GPU推奨)
  • TensorFlow / Keras
  • keras-tuner(別途インストール必要)

以下のコードで、keras-tunerをインストールします。

!pip install keras-tuner

今回使うデータ:MNIST(手書き数字)

from tensorflow import keras
from tensorflow.keras import layers
import keras_tuner as kt

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
x_train = x_train[..., None]
x_test = x_test[..., None]

モデル構築関数(HyperModel)

def build_model(hp):
    model = keras.Sequential()
    model.add(layers.Input(shape=(28, 28, 1)))

    for i in range(hp.Int("conv_layers", 1, 3)):
        model.add(layers.Conv2D(
            filters=hp.Int(f"filters_{i}", 32, 128, step=32),
            kernel_size=3,
            activation="relu"
        ))
        model.add(layers.MaxPooling2D())

    model.add(layers.Flatten())
    model.add(layers.Dense(
        units=hp.Int("dense_units", 32, 128, step=32),
        activation="relu"
    ))
    model.add(layers.Dense(10, activation="softmax"))

    model.compile(
        optimizer=keras.optimizers.Adam(
            hp.Float("learning_rate", 1e-4, 1e-2, sampling="log")
        ),
        loss="sparse_categorical_crossentropy",
        metrics=["accuracy"]
    )
    return model

自動調整されるハイパーパラメータの範囲

モデル構築関数で自動調整される各パラメータは以下です。

ハイパーパラメータ名 種類 値の範囲 説明
conv_layers 整数 (Int) 1 ~ 3 畳み込み層の数(最大3層)
filters_0 ~ filters_2 整数 (Int) 32 ~ 128(32刻み) 各Conv2D層のフィルタ数(層ごとに個別)
dense_units 整数 (Int) 32 ~ 128(32刻み) 全結合層(Dense)のユニット数
learning_rate 浮動小数 (Float) 1e-4 ~ 1e-2(logスケール) 学習率(最適な学習スピードの調整範囲)

説明

このモデルでは、Keras Tuner を使って以下のような範囲でハイパーパラメータを自動的に調整します。

  • 構造の深さを最適化するために、畳み込み層の数(1〜3層)を調整。
  • 各Conv2D層のフィルタ数(32〜128)を層ごとに最適化し、特徴抽出力を調整。
  • 全結合層のユニット数(32〜128)を変化させて分類精度を向上。
  • 学習率(1e-4〜1e-2)を対数スケールで探索し、学習の安定性とスピードのバランスを最適化。

これらのハイパーパラメータの探索によって、より高い精度と汎化性能を持つモデルを自動で見つけることができます。

チューナーの設定と実行

tuner = kt.RandomSearch(
    build_model,
    objective="val_accuracy",
    max_trials=5,
    executions_per_trial=1,
    overwrite=True,
    directory="my_dir",
    project_name="kt_mnist"
)

tuner.search(x_train, y_train, epochs=5, validation_split=0.2)

最終実行結果

約3分でパラメータが自動調整されました。

Trial 5 Complete [00h 00m 40s]
val_accuracy: 0.9823333621025085

Best val_accuracy So Far: 0.9895833134651184
Total elapsed time: 00h 03m 09s

ベストモデルの表示と評価

このコードは、Keras Tunerで自動調整されたモデルの中から最良のモデル(val_accuracyが最も高かったもの)を取り出し、その構造をsummar()で出力しています。

best_model = tuner.get_best_models(num_models=1)[0]
best_model.summary()

test_loss, test_acc = best_model.evaluate(x_test, y_test)
print(f"Test accuracy: {test_acc:.4f}")

評価結果

/usr/local/lib/python3.11/dist-packages/keras/src/saving/saving_lib.py:757: UserWarning: Skipping variable loading for optimizer 'adam', because it has 2 variables whereas the saved optimizer has 18 variables. 
  saveable.load_own_variables(weights_store.get(inner_path))
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d (Conv2D)                 │ (None, 26, 26, 128)    │         1,280 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d (MaxPooling2D)    │ (None, 13, 13, 128)    │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_1 (Conv2D)               │ (None, 11, 11, 96)     │       110,688 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_1 (MaxPooling2D)  │ (None, 5, 5, 96)       │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten (Flatten)               │ (None, 2400)           │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense)                   │ (None, 64)             │       153,664 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 10)             │           650 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 266,282 (1.02 MB)
 Trainable params: 266,282 (1.02 MB)
 Non-trainable params: 0 (0.00 B)
313/313 ━━━━━━━━━━━━━━━━━━━━ 3s 8ms/step - accuracy: 0.9872 - loss: 0.0403
Test accuracy: 0.9898

モデル構造のサマリ

自動調整されたパラメータは以下になりました。

Layer (type) Output Shape Param #
conv2d (Conv2D) (None, 26, 26, 128) 1,280
max_pooling2d (MaxPooling2D) (None, 13, 13, 128) 0
conv2d_1 (Conv2D) (None, 11, 11, 96) 110,688
max_pooling2d_1 (MaxPooling2D) (None, 5, 5, 96) 0
flatten (Flatten) (None, 2400) 0
dense (Dense) (None, 64) 153,664
dense_1 (Dense) (None, 10) 650
Total params: 266,282
Trainable params: 266,282
Non-trainable params: 0

まとめ

比較項目 従来のやり方 Keras Tuner利用
ハイパーパラメータ調整 手動で試行錯誤 自動化!
実装コスト 高い 低い
精度の向上 運次第 安定して高性能に

Keras Tunerを使うことで、初心者でも手軽に最適な構造が見つけられるようになります。
他のチューニング手法(Hyperband、Bayesian Optimization)もあるので、ぜひ試してみてください!

おすすめの記事

このブログを検索

自己紹介

はじめまして、機械学習を独学中のSHOU TAKEと申します。本ブログでは、Python・Keras・Google Colabを活用した画像分類やニューラルネットワークの実験記事を中心に発信しています。初学者の方にも分かりやすく、学んだことをそのまま実験形式でまとめるスタイルです。これまで取り組んだテーマには、学習率やOptimizerの比較、Batch Sizeの検証、事前学習の活用などがあります。ご質問やご感想は、お問い合わせフォームからお気軽にどうぞ。

お問い合わせフォーム

名前

メール *

メッセージ *

プライバシーポリシー

QooQ