ABOUT ME

-

  • [n414] 하이퍼 파라미터 튜닝
    AI 부트캠프 2021. 12. 22. 10:02

    교차 검증 (Cross Validation)

    x_train = pd.DataFrame(x_train)
    y_train = pd.DataFrame(y_train)
    
    for train_index, val_index in kf.split(np.zeros(x_train.shape[0])):
        training_data = x_train.iloc[train_index, :]
        training_data_label = y_train.iloc[train_index]
        validation_data = x_train.iloc[val_index, :]
        validation_data_label = y_train.iloc[val_index]
    
        model.compile(loss='mean_squared_error', optimizer='adam')
        model.fit(x_train, y_train,
                  epochs=10,
                  batch_size=32,
                  validation_data = (validation_data, validation_data_label),
                  )
    
        results = model.evaluate(x_test, y_test, batch_size=32)
        print("test loss, test mse:", results)

     

     

    하이퍼 파라미터

     

    • 그리드 서치는 탐색할 지점을 설정하면, 모든 지점에 해당하는 조합을 수행한다. 그리드 서치를 이용해서 최대 2개 정도의 파라미터 최적값을 찾는 것이 적합하다 (시간 때문).

     

    • 램덤 서치는 범위를 설정해주면, 그 안에서 랜덤으로 모델링을 한 뒤 그 중에서 최고 성능 모델을 반환한다. 따로 지정하지 않아도 중요한 하이퍼 파라미터에서는 탐색을 더 하고, 그렇지 않은 하이퍼 파라미터에 대해서는 덜 한다.

     

    Bayesian Methods

    • 이전 탐색 결과 정보를 새로운 탐색에 활용하는 방법이다.

     

    대표적으로 튜닝 가능한 파라미터

    • 배치 크기
    • 에포크
    • 옵티마이저
    • 학습률
    • 활성화 함수
    • Regularization
    • 은닉층의 노드 수

     

    Keras Tuner

    • 케라스 프레임워크에서 하이퍼 파라미터 튜닝을 위한 라이브러리 이다.

     

    1. 필요한 패키지 import 및 설치

    from tensorflow import keras
    from tensorflow.keras.layers import Dense, Flatten
    
    import tensorflow as tf
    import IPython
    !pip install -U keras-tuner
    import kerastuner as kt

     

    2. 데이터셋 로드 및 정규화

    (X_train, y_train), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()
    
    X_train = X_train.astype('float32') / 255.0
    X_test = X_test.astype('float32') / 255.0

     

    3. 모델링

    def model_builder(hp):
      model = keras.Sequential()
      model.add(Flatten(input_shape=(28, 28)))
    
      # 은닉층의 노드 수가 32부터 512까지 32개씩 증가하며 탐색
      hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
      model.add(Dense(units = hp_units, activation = 'relu'))
      model.add(Dense(10, activation='softmax'))
    
      # 학습률은 0.01, 0.001, 0.00013개 지점을 탐색
      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

     

    4. 하이퍼파라미터 튜닝을 위해 튜너 지정

    Random search, Bayesian optimization, Hyperband 등의 최적화 방법이 있다.

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

     

    5. Callback 함수 지정

    하이퍼 파라미터 탐색을 실행하기 전에, 학습이 끝날 때마다 이전 출력이 지워지는 콜백 함수를 정의한다.

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

     

    6. 하이퍼파라미터 탐색을 수행

    tuner.search(X_train, y_train, epochs = 10, validation_data = (X_test, y_test), callbacks = [ClearTrainingOutput()])
    
    best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]
    
    print(f"""
    하이퍼 파라미터 검색이 완료되었습니다. 
    최적화된 첫 번째 Dense 노드 수는 {best_hps.get('units')} 입니다.
    최적의 학습 속도는 {best_hps.get('learning_rate')} 입니다.
    """)

     

    7. 최고 성능을 나타낸 하이퍼파라미터 조합으로 다시 학습 진행

    model = tuner.hypermodel.build(best_hps)
    
    model.summary()
    model.fit(X_train, y_train, epochs = 10, validation_data = (img_test, label_test))

     

    댓글