[tensorflow 2.0]Keras Tuneを使用したスーパーパラメータチューニング

10279 ワード

Keras Tunerはライブラリです.Tunerコンポーネントは、モデルのスーパーパラメータを調整するために使用されます.マシンラーニング(ML)アプリケーションの適切なスーパーパラメータセットを選択するプロセスを、スーパーパラメータ調整またはスーパー調整と呼びます.TunerコンポーネントはPython KerasTuner APIを広く使用してスーパーパラメータを調整しています.注意:モデリングAPIに関係なく、KerasTunerライブラリはKerasモデルに限らず、スーパーパラメータ調整に使用できます.  スーパーパラメータは訓練過程とMLモデルのトポロジーを制御する変数である.これらの変数は訓練中に一定に維持され,MLプログラムの性能に直接影響を及ぼす.スーパーパラメータには、次の2種類があります.
  • モデルのスーパーパラメータ、例えば非表示レイヤの数と幅
  • このチュートリアルでは、ランダム勾配降下(SGD)の学習率や、K個の最近接(KNN)分類器の最近接数などのアルゴリズムのスーパーパラメータについて、Keras Tunerを使用して画像分類アプリケーションをオーバーシュートします.
    使用方法
     スーパーパラメータを調整するためのモデルを構築する場合、モデルアーキテクチャに加えて、スーパーパラメータ検索空間も定義します.オーバーチューニング設定のモデルをスーパーモデルと呼びます.2つの方法でスーパーモデルを定義できます.
  • モデルビルダー機能
  • を使用することにより、
  • サブクラス化Keras Tuner APIによるHyperModelクラス
  • さらに、2つの事前定義されたHyperModelクラス-HyperXceptionとHyperResNetをコンピュータビジュアルアプリケーションに使用することもできます.以下、モデルビルダー機能を使用して画像分類モデルを定義します.モデルビルダー関数は、コンパイルされたモデルを返し、インライン定義のスーパーパラメータを使用してモデルをオーバーシュートします.
    def model_builder(hp):
      model = keras.Sequential()
      model.add(keras.layers.Flatten(input_shape=(28, 28)))
    
      #               
      #         [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))
    
      #      opimizers    lr 
      # lr      0.01, 0.001, 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
    

    tunerをインスタンス化し、スーパーパラメトリック微調整を実行
    Tnerをインスタンス化してスーパーパラメータを実行します.Keras Tunerには4つの利用可能な同調法-ReandomSearch,Hyperband,BayesianOptimization,Sklearnがある.このチュートリアルでは、Hyperbandチューナを使用します.Hyperbandチューナをインスタンス化するには、スーパーモデル、最適化するターゲット、およびトレーニングする最大期間数(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+log⁡f a c t o r(m a x e p o c h s)1+log_を計算することによって{factor}(maxepochs)1+logfactor(maxepochs)を四捨五入し、カッコで訓練するモデルの数を決定します.  スーパーパラメータ検索を実行する前に、各トレーニングステップの終了時にトレーニング出力をクリアするコールバックを定義します.
    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')}.
    """)
    

    最後に,探索した最適超パラメータを用いてモデルを再訓練した.  my_dir/intro_to_ktディレクトリには、スーパーパラメータ検索中に実行される各試験(モデル構成)の詳細なログとチェックポイントが含まれます.スーパーパラメータ検索を再実行すると、Keras Tunerはこれらのログの既存のステータスを使用して検索を続行します.この動作を無効にするには、チューナをインスタンス化するときに追加のoverwrite=Trueパラメータを渡します.
    リファレンス
  • tensorflow 2ガイド
  • Tuner TFXパイプラインアセンブリ