はじめに
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)もあるので、ぜひ試してみてください!
0 件のコメント:
コメントを投稿