AI/딥러닝
[핸즈온머신러닝 | 10강] 케라스 사용법 + 인공 신경망 소개
Mujae98
2023. 12. 11. 23:08
좋은 말들
한 층에 있는 모든 뉴런이 이전 층의 모든 뉴런과 연결되어 있을 때 이를 완전 연결 층 또는 밀집 층이라고 부름.
은닉층의 연결 가중치를 랜덤하게 초기화하는 것이 중요. 0으로 초기화 하면 다 똑같아짐
Keras 모델 맹글기
- 시퀀셜 API 사용해서 모델 뼈대 만들기
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape = [28, 28])
model.add(keras.layers.Dense(300, activation="relu"))
model.add(keras.layers.Dense(100, activation="relu"))
model.add(keras.layers.Dense(10, activation="softmax")#클래스가 10개라 10, 분류라 softmax
- 모델 컴파일
model.compile(loss"sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"]
- 모델 훈련/평가
history = model.fit(X_train, y_train, epochs=30, validation_data = (X_valid, y_valid))
* 데이터셋에서 클래스간 뷸군형이 있으면 fit() 메서드를 호출할 때 class_weight 매개변수를 지정해서 가중치 부여
- 모델 예측
X_new = X_test[:3]
y_proba = model.preidct(X_new)
y_proba.round(2)
회귀도 가능
model = keras.models.Sequential([
keras.layers.Dense(30, activation="relu", input_shape=X_train.shape[1:]),
keras.layers.Dense(1)])#이런식으로 출력을 한 개로 해주면 됨.
함수형 API로 복잡한 모델(와이드 & 딥 신경망) 만들기
input_ = keras.layers.Input(shape = X_train.shape[1:])
hidden1 = keras.layers.Dense(30, activation = "relu")(input_)
hidden2 = keras.layers.Dense(30, activation = "relu")(hidden1)
concat = keras.layers.Concatenate()([input_, hidden2])
output = keras.layers.Dense(1)(concat)
model = keras.Model(inputs=[input_], outputs=[output])
이렇게 하면 다중 작업 분류를 수행할 수 있음.
모델 저장과 복원
model = keras.models.Sequential([...])
model.compile([...])
model.fit([...])
model.save("my_keras_model.h5")#HDF5 포맷으로 저장(모델 구조와 층의 모든 모델 파라미터, 옵티마이저까지 저장)
콜백 사용하기
checkpoing_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5")
history = model.fit(X_train, y_train, epochs=10,callbacks=[checkpoint_cb])
훈련하는 동안 일정한 간격으로 모델의 체크포인트를 저장(기본적으로 매 에포크 끝마다 호출됨)
### EarlyStopping
checkpoint_cb = keras.callbacks.ModelCheckpoint("my_keras_model.h5", save_best_only=True)
history = model.fit(X_train, y_train, epochs=10,
validation_data = (X_valid, y_valid),
callbacks=[checkpoint_cb])
model = keras.models.load_model("my_keras_model.h5") #베스트 모델
early_stopping_cb = keras.callbacks.EarlyStopping(patience=10, restore_best_weights=True)
history = model.fit(X_train, y_train, epochs=100,
validation_data = (X_valid, y_valid),
callbacks = [checkpoint_cb, early_stopping_cb])
텐서보드
#colab 기준 아래 명령어만 실행하면 됨
%load_ext tensorboard
%tensorboard --logdir=./my_logs --port=6006
하이퍼파라미터튜닝 부분 에러
#본문 코드
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)
#이 코드로 수정
from scikeras.wrappers import KerasRegressor
keras_reg = KerasRegressor(build_model)
#훈련
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)
Tip: 더 많은 층과 노드를 모델에 포함시키고 과대적합되지 않도록 조기 종료나 규제 기법을 사용하는 것이 좋으며, 일반적으로 층의 뉴런 수보다 층 수를 늘리는 쪽이 낫다.