핵심 키워드
- #드롭 아웃 #콜백 #조기 종료
- 인공 신경망 모델을 훈련하는 모범 사례와 필요한 도구들을 다뤄보면서 텐서플로와 케라스 API에 익숙해지자
손실 곡선
- 손실 곡선
fit() 메소드로 모델을 훈련하면 훈련 과정이 상세하게 출력되며 에포크 횟수, 손실, 정확도 등을 확인할 수 있음
이뿐만 아니라 케라스의 fit() 메소드는 훈련 과정에서 계산한 지표 값이 저장되는 History 클래스 객체를 반환함
이 값을 사용하면 그래프를 그릴 수 있음
그래프를 위해 fit() 메소드의 결과를 history 변수에 담아 확인하게 되면 훈련 측정값이 담겨 있는 history 딕셔너리가 들어있음
이 딕셔너리에는 손실과 정확도가 포함되며, history 속성에 포함된 손실과 정확도는 에포크마다 계산한 값이 나열된 리스트
그러므로 맷플롯립을 사용해 쉽게 그래프를 그릴 수 있음
그래프를 확인해보면 에포크마다 손실이 감소하고 정확도가 향상되는 것을 볼 수 있음
- 더 많은 에포크
위의 그래프를 통해 손실이 계속 감소하므로 에포크 횟수를 20으로 늘려서 모델을 훈련하고 손실 그래프를 그려보면
예상대로 손실이 잘 감소되는 것을 볼 수 있음
검증 손실
- 검증 손실
에포크에 따른 과대적합과 과소적합을 파악하려면 훈련 세트에 대한 점수뿐만 아니라 검증 세트에 대한 점수도 필요함
그러므로 에포크마다 검증 손실을 계산하기 위해
케라스 모델의 fit() 메소드에 검증 데이터인 검증에 사용할 입력과 타깃값을 튜플로 만들어 validation_data 매개변수에 전달함
이후 다시 반환된 history.history 딕셔너리를 확인해보면 검증 세트에 대한 손실과 정확도 또한 들어있음
그러므로 이를 사용해 과대/과소적합 문제를 조사하기 위해 훈련 손실과 검증 손실을 한 그래프에 그려서 비교함
그래프를 보면 초기에 검증 손실이 상승하다가 다섯 번째 에포크 만에 다시 상승하기 시작하며
훈련 손실은 꾸준히 감소하기 때문에 전형적인 과대적합 모델인 것을 알 수 있음
드롭아웃
- 드롭아웃
과대적합을 막기 위해 신경망에 특화된 규제 방법으로
훈련 과정에서 층에 있는 일부 뉴런을 랜덤하게 꺼서 (즉 뉴런의 출력을 0으로 만들어) 과대 적합을 막는 것으로
즉, 각 샘플을 처리할 때마다 은닉층에 있는 뉴런의 계산을 랜덤하게 끄고 훈련하는 것을 뜻함
이때 뉴런은 랜덤하게 드롭아웃되고 얼마나 많은 뉴런을 드롭할지는 우리가 정해야하는 하이퍼파라미터임
드롭아웃은 이전 층의 일부 뉴런이 랜덤하게 꺼지면 특정 뉴런에 과대하게 의존하는 것을 줄일 수 있고
모든 입력에 대해 주의를 기울여야 하므로 일부 뉴런의 출력이 없을 수 있다는 것을 감안하여 더 안정적인 예측을 만들 수 있음
케라스에서 드롭아웃은 keras.layers 패키지 아래 Dropout 클래스를 제공하며
어떤 층의 뒤에 드롭아웃을 두어 이 층의 출력을 랜덤하게 0으로 만듦
30% 정도로 드롭아웃되게 은닉층 뒤에 드롭아웃 객체를 전달하여 층을 추가하게 되면
은닉층 뒤에 추가된 드롭아우 층은 훈련되는 모델 파라미터가 없고 입력과 출력의 크기가 같은 것을 볼 수 있음
이는 일부 뉴런의 출력을 0으로 만들지만 전체 출력 배열의 크기는 바꾸지 않기 때문
이후 훈련이 끝난 뒤에 평가나 예측을 수행할 때는 드롭아웃을 적용하지 말아야 훈련된 모든 뉴런을 사용해 올바른 예측이 가능
텐서플로와 케라스는 모델을 평가와 예측에 사용할 때는 자동으로 드롭아웃을 적용하지 않으므로
쉽게 검증 점수를 계산한 후 훈련 손실과 검증 손실의 그래프를 그려 비교할 수 있음
과대적합이 확실히 줄은 것을 볼 수 있으며
열 번째 에포크 정도에서 검증 손실의 감소가 멈추지만 크게 상승하지 않고 어느정도 유지하는 것을 볼 수 있음
모델 저장과 복원
- 모델 저장과 복원
나중에 다시 사용하기 위해서는 모델을 저장해야 함
케라스 모델은 훈련된 모델의 파라미터를 저장하는 간편한 save_weights() 메소드를 제공하며
저장했던 모델 파라미터를 다시 적재하기 위해서는 load_weights() 메소드를 사용
또한 모델 구조와 모델 파라미터를 함께 저장하는 save() 메소드를 제공하며
모델이 저장된 파일을 읽을 때는 load_model() 메소드를 사용
훈련하지 않은 새로운 모델을 만들고
저장된 model-weights.h5 파일에서 훈련된 모델 파라미터를 읽어서 사용하기 위해서는 load_weight() 메소드를 사용
이 모델의 검증 정확도를 확인하기 위해 predict() 메소드를 사용하며 이는 샘플마다 10개의 클래스에 대한 확률을 반환함
이전에는 predict_classese() 메소드를 사용했지만 이는 향후 사라질 예정
이를 사용하면 패션 MNIST 데이터셋에서 덜어낸 검증 세트의 샘플 개수는 12000개이기 때문에 (12000, 10) 크기의 배열 반환
그리고 이러한 10개의 확률 중에서 가장 큰 값의 인덱스를 골라 타깃 레이블과 비교하기 위해 넘파이 argmax() 함수를 사용
argmax() 함수는 배열에서 가장 큰 값의 인덱스를 반환하며, axis=-1일 경우 배열의 마지막 차원을 따라 최댓값을 고름
이때 사용한 검증 세트는 2차원 배열이기 때문에 마지막 차원은 1이므로 axis=1과 같은 결과를 나타냄
그 다음으로 argmax()로 고른 인덱스(val_labels)와 타깃(val_target)을 비교하며
두 배열에서 각 위치의 값이 같으면 1이 되고 다르면 1이 되므로 이를 평균하여 정확도를 알아낼 수 있음
콜백
- 콜백
위에서는 20번의 에포크 동안 모델을 훈련하여 검증 점수가 상승하는 지점을 확인한 후
모델을 과대적합 되지 않는 에포크만큼 다시 훈련하여 모델을 두 번씩 훈련하였으나 콜백을 이용하면 한 번에 끝낼 수 있음
콜백은 훈련 과정 중간에 어떤 작업을 수행할 수 있게 하는 객체로 keras.callbacks 패키지 아래에 있는 클래스들
ModelCheckpoint 콜백은 기본적으로 에포크마다 모델을 저장하므로
save_best_only=True를 통해 가장 낮은 검증 점수를 만드는 모델을 저장할 수 잇음
ModelCheckPoint 클래스의 객체 checkpoint_cb를 만든 후에 fit() 메소드의 callbacks 매개변수에 리스트로 감싸서 전달
그러면 모델이 훈련한 후에 best-model.h5에 최상의 검증 점수를 낸 모델이 저장되며
이 모델을 load_model() 함수로 다시 읽어서 예측을 수행할 수 있음
- 조기종료
검증 점수가 상승하기 시작하면 그 이후에는 과대적합이 더 커지기 때문에 훈련을 계속할 필요가 없음
그러므로 과대적합이 시작되기 전에 훈련을 미리 중지하는 것을 조기 종료라고 부름
케라스에는 조기 종료를 위한 EarlyStopping 콜백을 제공하며
이 콜백의 patience 매개변수는 검증 점수가 향상되지 않더라고 참을 에포크 횟수를 지정하며
restore_best_weights 매개변수를 True로 지정하면 가장 낮은 검증 손실을 낸 모델 파라미터로 되돌림
그러므로 EarlyStopping 콜백은 ModelCheckpoint 콜백과 함께 사용하면
가장 낮은 검증 손실의 모델을 파일에 저장하고, 검증 손실이 다시 상승할 때 훈련을 중지할 수 있음
또한 훈련을 중지한 다음 현재 모델의 파라미터를 최상의 파라미터로 되돌려줌
EarlyStopping 콜백을 추가하기 위해서는 fit() 메소드의 callbacks 매개변수에 리스트로 전달하며
훈련을 마치고 나면 몇 번째 에포크에서 훈련이 중지되었는지 early_stopping_cb 객체의 stopped_epoch 속성 확인 가능
이를 확인해보면 에포크 횟수가 0부터 시작하기 때문에 8은 아홉 번째 에포크에서 훈련이 중지된 것을 의미하며
patience를 2로 지정했으므로 최상의 모델은 일곱 번째 에포크
훈련 손실과 검증 손실을 출력해서 확인해보면
일곱 번째 에포크(0부터 시작하므로 그래프 상 6)에서 가장 낮은 손실을 기록했고
아홉 번째 에포크(그래프 상 8)에서 훈련이 중지됨을 볼 수 있음
'ML > 혼자 공부하는 머신러닝 + 딥러닝' 카테고리의 다른 글
[혼공머신] 08. 이미지를 위한 인공 신경망 - 합성곱 신경망을 사용한 이미지 분류 (0) | 2022.07.13 |
---|---|
[혼공머신] 08. 이미지를 위한 인공 신경망 - 합성공 신경망의 구성 요소 (0) | 2022.07.12 |
[혼공머신] 07. 딥러닝을 시작합니다 - 심층 신경망 (0) | 2022.07.06 |
[혼공머신] 07. 딥러닝을 시작합니다 - 인공 신경망 (0) | 2022.07.05 |
[혼공머신] 06. 비지도 학습 - 주성분 분석 (0) | 2022.06.30 |