-
[HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리2[도서완독]Hands On Machine Learning 2022. 7. 1. 17:16
10.2 케라스로 다층 퍼셉트론 구현하기
10.2.2 시퀀셜 API를 사용하여 이미지 분류기 만들기
- 케라스를 사용하여 패션 MNIST 적재
픽셀 강도가 정수(0~255)로 되어 있음
경사 하강법으로 신경망 훈련하기 때문에 입력 특성의 스케일을 조정해야 함 <-왜?
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"))
모델 summary
-각 층의 이름: 정하지 않으면 자동으로 생성
-출력 크기: None은 배치 크기에 어떤 값도 가능하다는 의미
파라미터 개수
Dense 충은 많은 파라미터를 가지는데, 훈련 데이터를 학습하기 충분한 유연성 but 과대적합의 위험
층의 모든 파라미터는 get_weights() 메서드와 set_weights()메서드를 사용해 접근 가능
모델 컴파일
모델을 만들고 나서 compile() 메서드를 호출하여 손실 함수와 옵티마이저를 지정해야 함.
model.compile(loss="sparse_categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])
레이블이 정수 하나고, 클래스가 배타적이므로 "sparse_categorical_crossentropy" 손실
레이블이 원 핫 벡터라면, "categorical_crossentropy"
이진 분류라면 출력층에 "sigmoid", 손실로는 "binary_crossentropy"
모델 훈련과 평가
훈련 세트의 클래스가 편중되어 있다면 class_weight 매개변수 지정
- 적게 등장하는 클래스는 높은 가중치 부여, 많이 등장하는 클래스는 낮은 가중치 부여
샘플별로 가중치를 부여하고 싶다면 sample_weight 매개변수 지정
fit() 메서드가 반환하는 History 객체에는 훈련 파라미터(history.params), 수행된 에포크 리스트(history.epoch)가 포함.
이 객체에는 에포크가 끝날 때마다의 훈련 세트와 검증 세트에 대한 손실과 지표를 담은 history.history(딕셔너리)가 있음.이 딕셔너리를 사용해 판다스 데이터프레임을 만들고 plot() 메서드를 호출하면 learning curve를 볼 수 있음
훈련하는 동안 훈련 정확도와 검증 정확도가 꾸준히 상승,
훈련 손실과 검증 손실은 감소
검증 곡선이 훈련 곡선과 가까움 (크게 과대적합 되지 않았다는 증거)
- 훈련 손실은 에포크 진행 중 계산, 검증 손실은 에포크가 끝난 후에 계산
- 따라서 훈련 곡선을 볼때 왼쪽으로 에포크의 절반만큼 옆으로 이동해서 생각!
검증 손실이 여전히 감소한다면 모델이 완전히 수렴되지 않은 것. fit() 메서드를 다시 호출하면 중지되었던 곳에서부터 훈련을 이어나갈 수 있음
모델 성능이 만족스럽지 않으면?
처음으로 되돌아가서 하이퍼파라미터를 튜닝!
학습률을 가장 먼저 확인
도움이 안된다면, 다른 옵티마이저를 테스트
(다른 하이퍼파라미터를 바꾼 후에는 다시 학습률을 튜닝)
여전히 별로면, 층 개수, 층에 있는 뉴런 개수, 은닉층이 사용하는 활성화 함수 등을 튜닝
배치 크기 등...
검증 정확도가 만족스럽다면?
evaluate 메서드는 batch_size와 sample_weight 같은 다른 매개변수도 지원
모델을 사용해 예측을 만들기
X_new=X_test[:3] y_proba=model.predict(X_new) #y_pred=model.predict_classes(X_new) y_proba.round(2) np.argmax(y_proba[0]) np.argmax(y_proba[1]) np.argmax(y_proba[2])
잘.. 됨...
10.2.3 시퀀셜 API를 사용하여 회귀용 다층 퍼셉트론 만들기
이미지 분류기와 거의 비슷하므로 차이점만 짚고 넘어가겠음.
출력층이 활성화 함수가 없는 하나의 뉴런.
손실 함수-> MSE
데이터에 잡음이 많기 때문에 과대적합을 막는 용도로 뉴런 수가 적은 은닉층 하나만 사용했다고 함.
여튼 시퀀셜 API는 매우 쉽당. 하지만 입력,출력이 여러 개거나 더 복잡한 신경망을 만들어야 할 때, 함수형(functional API)를 사용한다! 그건 다음 포스팅에서!
'[도서완독]Hands On Machine Learning' 카테고리의 다른 글
[HandsOn]11. 심층 신경망 훈련하기 - 내용 정리 1 (0) 2022.07.05 [HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리 3 (0) 2022.07.01 [HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리1 (0) 2022.06.28 [HandsOn]12. 텐서플로를 사용한 사용자 정의 모델과 훈련 - 연습문제 (0) 2022.02.15 [HandsOn]11.심층 신경망 훈련하기- 연습문제 (0) 2022.01.19