はじめに|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など他のチューニングアルゴリズムも試してみることで、さらに性能を引き出せるかもしれません。
0 件のコメント:
コメントを投稿