참조 칼럼 : How to Grid Search Hyperparameters for Deep Learning Models in Python with Keras
- 최적화 알고리즘 : Adam, Adadelta, Adagrad, SGD 등
- 알고리즘 하이퍼파라미터 : Learning rate, momentum 등 알고리즘 별 하이퍼파라미터
- Network Initialization : 가중치를 초기화 하는 방법
- 활성 함수 : relu, swish, sigmoid 등
- Dropout_rate : 매 배치 당 제거할 노드의 비율
- 뉴런(노드)의 수 : 히든 레이어의 크기
이 외에 히든 레이어의 수도 있지만, 이는 Grid Search에서 탐색할 방법을 찾지 못했다.
scikeras
패키지를 설치해야한다.try:
import scikeras
except:
!python -m pip install scikeras
from scikeras.wrappers import KerasClassifier, KerasRegressor
# 모델 함수
def create_model(nureons=16, activation='swish', dropout_rate=0.0, optimizer='adam'):
keras.backend.clear_session()
# 레이어 연결
il = Input(shape=(8, ))
hl = Dense(nureons, activation=activation)(il)
dl = Dropout(dropout_rate)(hl)
hl = Dense(nureons, activation=activation)(dl)
dl = Dropout(dropout_rate)(hl)
hl = Dense(8, activation=activation)(dl)
dl = Dropout(dropout_rate)(hl)
ol = Dense(1, activation='sigmoid')(dl)
# 모델 선언
model = Model(il, ol)
# 컴파일
model.compile(loss=keras.losses.binary_crossentropy,
metrics=['accuracy'],
optimizer=optimizer)
return model
# Scikeras로 래핑
model = KerasClassifier(model=create_model, verbose=0, epochs=100,
optimizer='Nadam', activation='relu')
자세한 것은 공식문서 참조
from
# 파라미터 설정
nureons = [8, 16, 32, 64, 128]
optimizer = ['SGD', 'RMSprop', 'Adadelta', 'Adam', 'Nadam']
param_grid = dict(
model__nureons = nureons,
model__optimizer = optimizer
)
# GridSearchCV
grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=-1, cv=5)
# Grid Search
grid_result = grid.fit(x_train, y_train, validation_split=0.2, callbacks=[es])
best_scores_
: 최고성능일 때의 성능 점수best_params_
: 최고성능일 때의 하이퍼파라미터 설정값cv_results_
: 각 그리드서치 조합의 결과를 딕셔너리 형태로 반환별다른 강의 없이 무작정 실습으로 배운 것인데 다행히 잘 작동되었다.
그러나 EarlyStopping이 정상 작동된건지 확인할 방법이 없어 이 부분을 추가로 학습해야할 것 같다.
한가지 더 궁금한 것은 어떠한 순서대로 하이퍼파라미터의 최적값을 탐색해야 가장 좋은 모델을 얻을 수 있을까? 이다. optimizer를 먼저 찾아야 할지, 노드의 수를 먼저 찾아야 할지 잘 짐작이 가지 않는다. 이부분에 대한 칼럼 및 동영상을 찾아서 배워보아야겠다.