【徹底解説】Keras TunerでCNNのハイパーパラメータを自動最適化|MNIST画像分類の精度を向上!

2025年6月6日金曜日

CNN Google Colab Keras Keras Tuner 画像分類

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

はじめに|Keras Tunerでハイパーパラメータを自動最適化しよう

ディープラーニングモデルの精度を上げるためには、適切なハイパーパラメータの設定が不可欠です。しかし、「層の深さ」や「ユニット数」、「学習率」などを手動で調整するのは手間がかかりますよね。

そこで活躍するのが、Keras Tuner です。これは、Keras公式が提供するハイパーパラメータ自動探索ツールで、最適なモデル構造と学習設定を効率よく見つけてくれます。

本記事では、画像分類(MNIST)を題材にKeras Tunerを活用し、以下のようなパラメータを自動的に調整して精度を最大化する方法を解説します。

  • 畳み込み層(Conv2D)の数とフィルタ数
  • 全結合層のユニット数
  • 学習率(learning rate)

チューニング作業にかかる時間と労力を大幅に削減したい方、Keras Tunerの使い方を知りたい方におすすめの内容です。

使用環境とKeras Tunerのセットアップ方法|Google Colabで簡単に開始

今回のチュートリアルでは、Google Colabを使ってKeras Tunerを実行していきます。ColabはGPUが利用でき、 無料で高性能なマシン環境が使えるため、ディープラーニングの実験に最適です。

Keras Tunerの動作に必要な環境

  • Google Colab(GPUオプション推奨)
  • TensorFlow / Keras(バージョン2.12以上推奨)
  • keras-tuner(別途インストールが必要)

keras-tunerのインストール方法

Google Colab上で以下のコードを実行することで、keras-tunerライブラリを簡単にインストールできます。

!pip install keras-tuner

インストールが完了すれば、Keras Tunerを用いたハイパーパラメータの自動最適化を行う準備が整います。

MNISTデータセットの読み込みと前処理|Kerasで手書き数字画像を準備しよう

Kerasには、画像分類タスクで広く使われている有名なデータセット 「MNIST」 が標準搭載されています。 MNISTは、0〜9の手書き数字のグレースケール画像が含まれており、ディープラーニング入門やモデルの比較に最適です。

MNISTデータの読み込み

以下のコードで、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()

データの前処理(正規化とチャンネル次元の追加)

画像データをディープラーニングモデルに適した形式に変換するために、次のような前処理を行います。

  • 正規化: ピクセル値を0〜255から0〜1の範囲に変換
  • チャンネル次元の追加: Conv2Dに対応させるため、(28, 28) → (28, 28, 1)
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]

これにより、データはKerasの畳み込みニューラルネットワーク(CNN)モデルでそのまま使用可能な形になります。

この段階までで、モデルの学習に必要な画像データの準備が整いました。

ハイパーパラメータ対応のモデル構築関数を定義

Keras Tunerでは、HyperModelとしてパラメータ探索対象のモデル構造を関数で定義します。
ここでは以下の要素を自動調整の対象にしています:

  • 畳み込み層の数(1〜3層)
  • 各Conv2D層のフィルタ数(32〜128)
  • 全結合層のユニット数(32〜128)
  • 学習率(1e-4〜1e-2)
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

CNNモデルで調整するハイパーパラメータの解説

以下の表は、Keras Tunerによって自動調整されるハイパーパラメータの一覧です。

パラメータ名 探索範囲 説明
conv_layers Int 1 ~ 3 畳み込み層の数
filters_0 ~ filters_2 Int 32 ~ 128(32刻み) 各畳み込み層のフィルタ数
dense_units Int 32 ~ 128 全結合層のユニット数
learning_rate Float 1e-4 ~ 1e-2(log) 学習率

これらのパラメータを最適化することで、過学習を抑えつつ、汎化性能の高いモデルが得られます。

説明

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

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

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

Keras Tunerでハイパーパラメータ探索を開始する

Keras TunerのRandomSearchクラスを使って、モデルの精度(val_accuracy)を最大化するようなパラメータを探索します。

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

ベストモデルを表示してテストデータで評価

探索されたモデルのうち、最も精度の高かったものを取得して評価を行います。

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

テスト精度:98.98%という非常に高い結果が得られました!

最適化されたCNNモデルの構造とパラメータ数

以下は、最良モデルの構成と各層のパラメータ数です。

レイヤー 出力形状 パラメータ数
Conv2D(None, 26, 26, 128)1,280
MaxPooling2D(None, 13, 13, 128)0
Conv2D(None, 11, 11, 96)110,688
MaxPooling2D(None, 5, 5, 96)0
Flatten(None, 2400)0
Dense(None, 64)153,664
Dense(None, 10)650
合計パラメータ数266,282

まとめ:Keras Tunerでモデル開発を効率化

比較項目手動調整Keras Tuner
チューニング工数多い少ない
精度の安定性運に左右安定して高精度
初心者の扱いやすさ難しい簡単

Keras Tunerを活用することで、機械学習の専門知識が少ない方でも高性能なモデル構築が可能になります。
Bayesian OptimizationやHyperbandなど他のチューニングアルゴリズムも試してみることで、さらに性能を引き出せるかもしれません。

関連記事

このブログを検索

このブログのまとめページ

自己紹介

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

お問い合わせフォーム

名前

メール *

メッセージ *

プライバシーポリシー

QooQ