njs03332 / ml_study

3 stars 0 forks source link

2022/12/23 ~ 2022/12/30 #52

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
njs03332 commented 1 year ago

10.2.8 텐서보드를 사용해 시각화하기

# 사용할 루트 로그 디렉터리 정의
import os
root_logdir = os.path.join(os.curdir, "my_logs")

# 현재 날짜와 시간을 사용해 실행할 때마다 다른 서브디렉터리 경로를 생성하는 함수
def get_run_logdir():
    import time
    run_id = time.strftime("run_%Y_%m_%d-%H_%M_%S)
    return os.path.join(root_logdir, run_id)

run_logdir = get_run_logdir()

# 모델 구성 & 컴파일 후
tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)
history = model.fit(X_train, y_train, epochs=30,
                               validation_data=(X_valid, y_valid),
                               callbacks=[tensorboard_cb])
# 텐서보드 서버 시작 (터미널)
$ tensorboard --logdir=./my_logs --port=6006
# 텐서보드 서버 시작 (주피터)
%load_ext tensorboard
%tensorboard --logdir=./my_logs --port=6006
danbi5228 commented 1 year ago

10.3.1 은닉층 개수

10.3.2 은닉층 뉴런 개수

10.3.3 학습률, 배치 크기 그리고 다른 하이퍼파라미터

givitallugot commented 1 year ago

10.3 신경망 하이퍼파라미터 튜닝하기

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)

keras_reg.fit(X_train, y_train, epochs=100,
              validation_data=(X_valid, y_valid),
              callbacks=[keras.callbacks.EarlyStopping(patience=10)]) # fit으로 학습 가능
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)])

# 학습...

rnd_search_cv.best_params_ # {'learning_rate': 0.005803602934201024, 'n_hidden': 3, 'n_neurons': 74}
rnd_search_cv.best_score_ # -0.3189570407072703
model = rnd_search_cv.best_estimator_.model

효율적으로 하이퍼파라미터 공간을 탐색하는 기법

  1. 하이퍼파라미터 값의 범위를 크게 하여 빠르게 첫번째 랜덤 탐색을 수행
  2. 첫 번째 탐색에서 찾은 최상의 하이퍼파라미터 값을 중심으로 더 좁은 범위를 탐색
  3. 그 외의 파이썬 라이브러리 활용 (ex Hyperopt, Hyperas, 케라스 튜너, Scikit-Optimize, Spearmint, Hyperband, Sklearn-Deap)