역시나 GridSearchCV나 RandomizedSearchCV 를 사용해 공간을 탐색할 수 있다.
먼저 모델을 만들고 컴파일하는 함수를 만들자.
def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape=input_shape))
for layer in range(n_hidden):
model.add(keras.layers.Dense(n_neurons, activation="relu"))
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(learning_rate=learning_rate)
model.compile(loss="mse", optimizer=optimizer)
return model
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)
함수를 만들고 난 후 KerasRegressor 클래스의 객체를 만들게 된다. build_model() 함수로 만들어진 케라스 모델을 감싸는 래퍼이다! (따라서 함수가 저렇게 안에 들어간다.)
이제 keras_reg 객체를 자유롭게 사용하면 된다.
keras_reg.fit(X_train, y_train, epochs=100,
validation_data=(X_valid, y_valid),
callbacks=[keras.callbacks.EarlyStopping(patience=10)])
mse_test = keras_reg.score(X_test, y_test)
y_pred = keras_reg.predict(X_new)
이제 본격적으로 랜덤 탐색을 통해 하이퍼파라미터 탐색을 수행해보자.
from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV
param_distribs = {
"n_hidden": [0, 1, 2, 3],
"n_neurons": np.arange(1, 100).tolist(),
"learning_rate": reciprocal(3e-4, 3e-2).rvs(1000).tolist(),
}
rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)
rnd_search_cv.fit(X_train, y_train, epochs=100,
validation_data=(X_valid, y_valid),
callbacks=[keras.callbacks.EarlyStopping(patience=10)])
각각
이제 rndsearch_cv 에는 best_prams 라는 최상의 하이퍼파라미터가 들어있다.
rnd_search_cv.best_params_
rnd_search_cv.best_score_
후에 테스트 셋에서 평가하고 배포하면 된다.
랜덤 탐색 이외에 효율적으로 공간을 탐색하는 방법은 다음과 같다.
이제 하이퍼파라미터에서 좋은 값을 선택하는 가이드라인을 개념적으로 알아보자.
은닉층 개수
은닉층의 뉴런 개수
뉴런개수는 작업에 필요한 입력과 출력의 형태에 따라 결정된다.
MNIST 의 경우 28X28 의 입력 뉴런과 10개의 출력 뉴런이 필요했었다.
학습률
옵티마이저
후에 고급 옵티마이저에 대해 살펴보자.
배치크기
활성화 함수
반복 횟수
등이 조절 가능한 하이퍼파라미터이다!