今日のローカルTensorFlowEverywhereイベントの出欠確認!

Keras Tuner の基礎

TensorFlow.org で表示 Google Colab で実行 GitHub でソースを表示 ノートブックをダウンロード

概要

Keras Tuner は、TensorFlow プログラム向けに最適なハイパーパラメータを選択するためのライブラリです。ユーザーの機械学習(ML)アプリケーションに適切なハイパーパラメータを選択するためのプロセスは、ハイパーパラメータチューニングまたはハイパーチューニングと呼ばれます。

ハイパーパラメータは、ML のトレーニングプロセスとトポロジーを管理する変数です。これらの変数はトレーニングプロセス中、一貫して定数を維持し、ML プログラムのパフォーマンスに直接影響を与えます。ハイパーパラメータには、以下の 2 種類があります。

  1. モデルハイパーパラメータ: 非表示レイヤーの数と幅などのモデルの選択に影響します。
  2. アルゴリズムハイパーパラメータ: 確率的勾配降下法(SGD)の学習速度や k 最近傍(KNN)分類器の最近傍の数など、学習アルゴリズムの速度と質に影響します。

このチュートリアルでは、Keras Tuner をし米須ヒデ、画像分類アプリケーションのハイパーチューニングを実施します。

セットアップ

import tensorflow as tf
from tensorflow import keras

import IPython

Keras Tuner をインストールしてインポートします。

!pip install -q -U keras-tuner
import kerastuner as kt

データセットをダウンロードして準備する

このチュートリアルでは、Keras Tuner を使用して、Fashion MNIST データセットの服飾の画像を分類する学習モデル向けに最適なハイパーパラメータを見つけます。

データを読み込みます。

(img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26427392/26421880 [==============================] - 1s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4423680/4422102 [==============================] - 0s 0us/step

# Normalize pixel values between 0 and 1
img_train = img_train.astype('float32') / 255.0
img_test = img_test.astype('float32') / 255.0

モデルを定義する

ハイパーチューニングを行うモデルを構築する際、モデルアーキテクチャのほかにハイパーパラメータ検索空間も定義します。ハイパーチューニング用にセットアップするモデルをハイパーモデルと呼びます。

ハイパーモデルの定義は、以下の 2 つの方法で行います。

  • モデルビルダー関数を使用する
  • Keras Tuner API の HyperModel クラスをサブクラス化する

また、コンピュータビジョンアプリケーション用の HyperXceptionHyperResNet という 2 つの事前定義済みの HyperModel クラスも使用します。

このチュートリアルでは、モデルビルダー関数を使用して、画像分類モデルを定義します。モデルビルダー関数は、コンパイル済みのモデルを返し、インラインで定義するハイパーパラメータを使用してモデルをハイパーチューニングします。

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

チューナーをインスタンス化してハイパーチューニングを実行する

チューナーをインスタンス化して、ハイパーチューニングを実行します。Keras Tuner には、RandomSearchHyperbandBayesianOptimization、および Sklearn チューナーがあります。このチュートリアルでは、Hyperband チューナーを使用します。

Hyperband チューナーをインスタンス化するには、ハイパーモデル、最適化する objective、およびトレーニングするエポックの最大数(max_epochs)を指定する必要があります。

tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = 10,
                     factor = 3,
                     directory = 'my_dir',
                     project_name = 'intro_to_kt')

Hyperband チューニングアルゴリズムは、適応型リソース割り当てと早期停止を使用して、高パフォーマンスモデルに素早く収束させます。これは、トーナメント式のツリーを使用して行われます。アルゴリズムは、数回のエポックで大量のモデルをトレーニングし、性能の高い上位半数のモデル次のラウンドに持ち越します。Hyperband は、1 + logfactor(max_epochs) を計算し、直近の整数に繰り上げて、トーナメントでトレーニングするモデル数を決定します。

ハイパーパラメータ検索を実行する前に、トレーニングステップごとにトレーニング出力をクリアにするコールバックを定義します。

class ClearTrainingOutput(tf.keras.callbacks.Callback):
  def on_train_end(*args, **kwargs):
    IPython.display.clear_output(wait = True)

ハイパーパラメータ検索を実行します。検索メソッドの引数は、上記のコールバックのほか、tf.keras.model.fit に使用される引数と同じです。

tuner.search(img_train, label_train, epochs = 10, validation_data = (img_test, label_test), callbacks = [ClearTrainingOutput()])

# 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 37s]
val_accuracy: 0.8565999865531921

Best val_accuracy So Far: 0.8842999935150146
Total elapsed time: 00h 07m 10s
INFO:tensorflow:Oracle triggered exit

The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is 416 and the optimal learning rate for the optimizer
is 0.001.


このチュートリアルの最後のステップとして、検索から得た最適なハイパーパラメータでモデルを保存します。

# Build the model with the optimal hyperparameters and train it on the data
model = tuner.hypermodel.build(best_hps)
model.fit(img_train, label_train, epochs = 10, validation_data = (img_test, label_test))
Epoch 1/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.5889 - accuracy: 0.7954 - val_loss: 0.4125 - val_accuracy: 0.8529
Epoch 2/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3709 - accuracy: 0.8651 - val_loss: 0.3954 - val_accuracy: 0.8543
Epoch 3/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3230 - accuracy: 0.8801 - val_loss: 0.3757 - val_accuracy: 0.8601
Epoch 4/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3002 - accuracy: 0.8881 - val_loss: 0.3803 - val_accuracy: 0.8618
Epoch 5/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2795 - accuracy: 0.8969 - val_loss: 0.3422 - val_accuracy: 0.8789
Epoch 6/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2601 - accuracy: 0.9022 - val_loss: 0.3279 - val_accuracy: 0.8833
Epoch 7/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2544 - accuracy: 0.9048 - val_loss: 0.3473 - val_accuracy: 0.8780
Epoch 8/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2411 - accuracy: 0.9101 - val_loss: 0.3481 - val_accuracy: 0.8812
Epoch 9/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2310 - accuracy: 0.9134 - val_loss: 0.3311 - val_accuracy: 0.8882
Epoch 10/10
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2259 - accuracy: 0.9154 - val_loss: 0.3226 - val_accuracy: 0.8914

<tensorflow.python.keras.callbacks.History at 0x7f91b40bf978>

my_dir/intro_to_kt ディレクトリには、ハイパーパラメータ検索中に実行された各トライアル(モデル構成)の詳細なログとチェックポイントが含まれます。ハイパーパラメータ検索を再実行する場合、Keras Tuner は、これらのログの既存の状態を使用して、検索を再開します。この動作を無効にするには、チューナーをインスタンス化する際に、overwrite = True 引数を追加で渡してください。

まとめ

このチュートリアルでは、Keras Tuner の使用して、モデルのハイパーパラメータを調整する方法を学習しました。Keras Tuner の調査委については、以下のその他のリソースをご覧ください。

また、モデルのハイパーパラメータを対話式で調整できる、TensorBoard の HParams Dashboard もご覧ください。