728x90
하이퍼파라미터, Kfold Cross-Validation, Keras Tuner Hyperband Tuner
하이퍼파라미터
- 하이퍼파라미터 조정(Tuning)은 모델 성능에 엄청난 영향을 끼치는 요소이기 때문에 시간이 많이 소요되더라도 반드시 해주어야 한다.
- 딥러닝에서는 하이퍼파라미터가 굉장히 많다.
- 튜닝가능한 파라미터
- 배치 크기(batch_size)
- 에포크(epochs)
- 옵티마이저(optimizers)
- 학습률(learning rate)
- 활성화 함수(activation)
- Regularization(weight decay, Dropout 등)
- 은닉층(Hidden layer)의 노드(Node) 수
Kfold Cross-Validation
- k-fold cross-validation(k-겹 교차 검증)은 가장 널리 사용되는 교차 검증 방법의 하나로, 데이터를 k개로 분할한 뒤, k-1개를 학습용 데이터 세트로, 1개를 평가용 데이터 세트로 사용하는데, 이 방법을 k번 반복하여 k개의 성능 지표를 얻어내는 방법이다.
- Grid Search
- 하이퍼파라미터마다 탐색할 지점을 정해주면 모든 지점에 해당하는 조합을 알아서 수행
- 보다 직접적인 영향을 주는 하이퍼파라미터가 따로 있기 때문에 중요한 파라미터만 해도 좋은 성능을 낼수있어서 효율이 좋은 방법은 아닌것 같다.
- Random Search
- 상대적으로 중요한 하이퍼파라미터에 대해서는 탐색을 더 하고, 덜 중요한 하이퍼파라미터에 대해서는 실험을 덜 하도록 한다.
- Grid Search에 비해서 걸리는 시간이 적다.
- Bayesian Methods
- 이전 탐색 결과 정보를 새로운 탐색에 활용하는 방법
Keras Tuner Hyperband Tuner
- hypermodel: 노트에서 함수로 정의해 준 모델(model_builder)을 넣어준 파라미터
- objective: 평가지표 (예- ‘val_accuracy’)
- max_epochs: 튜닝하는 하이퍼파라미터별 최대 검증 epoch
- factor, hyperband_iterations —> 하이퍼파라미터별 검증 epoch 수 결정
- directory, project_name —> 이름대로 폴더 생성해서 trial별 검증값들을 파일로 저장
# 모델 만들기
def model_builder(hp):
model = Sequential()
# Dense layer에서 노드 수를 조정(32-512)
hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
model.add(Dense(units = hp_units, activation='relu'))
model.add(Dense(units = hp_units, activation='relu'))
model.add(Dense(1, activation='sigmoid')) # 이진분류니까 노드수 1, 활성함수로는 시그모이드
# Optimizer의 학습률(learning rate)을 조정[0.01, 0.001, 0.0001]합니다.
hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4])
# 컴파일 단계, 옵티마이저와 손실함수, 측정지표를 연결해서 계산 그래프를 구성함
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = hp_learning_rate),
loss=keras.losses.BinaryCrossentropy(from_logits = True),
metrics=['accuracy'])
return model
# 튜너를 인스턴스화하고 하이퍼 튜닝을 수행
tuner = kt.Hyperband(model_builder,
objective = 'val_accuracy',
max_epochs = 30,
factor = 3,
directory = 'my_dir',
project_name = 'intro_to_kt')
# callback 정의 : 하이퍼 파라미터 검색을 실행하기 전에 모든 교육 단계가 끝날 때마다 교육 출력을 지우도록 콜백을 정의합니다.
class ClearTrainingOutput(tf.keras.callbacks.Callback):
def on_train_end(*args, **kwargs):
IPython.display.clear_output(wait = True)
tuner.search(X_train_scaled, y_train, epochs = 30, batch_size=50, validation_data = (X_test_scaled,y_test), callbacks = [ClearTrainingOutput()])
best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]
print(f"""
최적화된 Dense 노드 수 : {best_hps.get('units')}
최적화된 Learning Rate : {best_hps.get('learning_rate')}
""")
# Keras 튜너를 활용하여 얻어낸 파라미터를 입력
from tensorflow.keras import regularizers
tf.random.set_seed(1442)
initializer = tf.keras.initializers.HeNormal()
model = Sequential()
model.add(Dense(best_hps.get('units'),
activation='relu', kernel_initializer=initializer,
kernel_regularizer=regularizers.l2(0.01), # L2 norm regularization
activity_regularizer=regularizers.l1(0.01))) # L1 norm regularization))
model.add(Dense(best_hps.get('units'),
activation='relu', kernel_initializer=initializer,
kernel_regularizer=regularizers.l2(0.01), # L2 norm regularization
activity_regularizer=regularizers.l1(0.01)))
model.add(Dense(1, activation='sigmoid')) # 이진분류니까 노드수 1, 활성함수로는 시그모이드
model.compile(optimizer=keras.optimizers.Adam(learning_rate = best_hps.get('learning_rate')),
loss='binary_crossentropy',
metrics=['accuracy'])
results = model.fit(X_train_scaled, y_train, epochs=2, batch_size=50, validation_data=(X_test_scaled,y_test))
# 테스트셋 사용해서 결과 보기
model.evaluate(X_test_scaled, y_test, verbose=2)
300x250
'코딩💻' 카테고리의 다른 글
[Tensorflow] TFRecord 파일은 무엇일까? (1) | 2024.01.09 |
---|---|
[Tensorflow] 배치사이즈와 num_steps이란? 적정하게 결정하기 (0) | 2024.01.09 |
[Deep Learning] 학습률, 가중치 초기화, 과적합 (0) | 2022.11.16 |
[Machine learning] 릿지회귀 (Ridge regression), One-Hot Encoding, 특성선택 (0) | 2022.11.16 |
[Machine learning] 과적합,과소적합, 회귀모델의 평가지표(MAE,MSE,RMSE) (0) | 2022.11.16 |