일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 데이터베이스
- 컴퓨터비전
- rnn
- html/css
- JSP
- 자바스크립트
- 중학수학
- JDBC
- SQL
- 자바스크립트심화
- 자바
- CSS
- JSP/Servlet
- c언어
- 자바 실습
- 중학1-1
- 상속
- 개발일기
- 연습문제
- ChatGPT
- 디버깅
- 순환신경망
- 딥러닝
- 데이터분석
- 컴퓨터구조
- 머신러닝
- 혼공머신
- 파이썬
- 정보처리기사필기
- 정보처리기사실기
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
케라스 6 - 콜백(Callback) 본문
콜백도 이미 공부한 내용이지만 이 책에서는 매우 자세하고 깊이 있게 다루고 있다. 콜백은 모델을 훈련할 때 보조적인 작업을 수행할 수 있도록 도와주는 객체다. 모델을 훈련할 때 사용하는 fit() 메서드에 callbacks 매개변수로 지정할 수 있다. tensorflow.keras.callbacks 패키지 내 다양한 콜백이 정의되어 있다. 이중 가장 많이 활용하는 콜백 함수 몇 가지를 소개한다.
앞에서 사용한 mnist 데이터셋을 다시 불러오고, Dense 레이어로 구성된 모델을 정의하고 컴파일한다.
1. 모델 체크포인트
모델 체크포인트는 가장 많이 활용되는 콜백이다. 모델 훈련 시 콜백으로 지정해 줄 수 있으며 epoch 별 모델의 가중치를 저장한다. 저장할 때 마치 체크포인트를 생성하듯 미리 정해놓은 규칙에 의하여 체크포인트를 생성하고 저장한다.
주요 하이퍼파라미터에 대한 세부 내용은 다음과 같다.
- filepaht : 체크포인트의 저장 경로 지정
- save_weights_only : 가중치만 저장할지 여부 설정
- save_best_only : monitor 기준으로 가장 높은 epoch만 저장할지 아니면 매 epoch별 저장할지 여부를 결정
- monitor : 저장시 기준이 되는 지표 설정
- verbose : 1로 설정 시 매 epoch별 저장 여부를 알려주는 로그 메시지 출력
책과 달리 ckpt 확장자로 하면 오류가 뜬다. weights.h5로 바꿔야 해결이 된다. 이유는 귀찮아서 쓰지 않기로 했다.
모델 체크포인트 객체를 생성 후 모델 훈련 시 callbacks 매개변수에 지정하면 된다.
매 epoch마다 모델 체크포인트의 저장 여부를 알려주는 로그 메시지가 출력되며, 가장 검증 손실이 낮았던 epoch 8일 때의 가중치가 현재 모델 체크포인트에 저장되었음을 알 수 있다.
저장한 가중치를 model 인스턴스를 적용하려면 load_weights() 메서드에 모델 체크포인트 파일 경로를 지정하여 호출해주어야 한다. 이처럼 모델에 저장한 가중치를 명시적으로 로드해 주어야 검증 손실이 가장 낮았던 가중치가 모델에 로드된다.
이렇게 명시적으로 호출하지 않으면 훈련이 완료되더라도 가중치가 로드되지 않음에 유의한다.
모델 체크포인트에 저장되어 있는 가중치를 불러온 뒤에는 가장 검증 손실이 낮았던 epoch 8 실행 후의 손실이 낮아진다. 따라서 검증 손실이 가장 낮았던 모델 가중치를 그대로 불러오는 것을 알 수 있다.
2. 조기 종료
tensorflow.keras.callbacks.Earlystopping() 객체로 생성하며 모델 훈련 시 patience에 지정된 epoch 안에 손실이 줄어들지 않는다면 모델 훈련을 조기 종료한다. 다음은 조기 종료 기준이 되는 지표를 검증 손실로 설정하고, patience = 3으로 설정해 조기 종료 콜백을 생성한다. 따라서 3 epoch 동안 손실이 줄어들지 않으면 모델 훈련이 종료된다.
모델 체크포인트 콜백과 마찬가지로, 조기 종료 콜백 또한 모델을 훈련하는 fit() 메서드 안에 callbacks 매개변수로 지정한다. 이번 훈련은 epoch를 넉넉하게 20으로 지정했다.
epoch를 20으로 설정하였음에도 조기종료 콜백에서 검증 손실 기준 3 epoch 동안 개선이 일어나지 않으면 조기 종료하는 규칙에 걸려 훈련을 조기 종료했다.
3. 학습 스케줄러(Learning Rate Scheduler)
학습 스케줄러는 tensorflow.keras.callbacks.LearningRateScheduler() 객체로 생성하여 훈련에 대한 학습률을 조정한다. 학습률을 특정 로직에 의하여 제어하고자 할 때 로직을 함수로 구현한 뒤 LearningRateScheduler 객체에 적용해 주면 된다.
다음은 첫 5 epoch 동안은 학습률을 유지하되 6 epoch부터는 학습률을 감소시키는 예시다.
모델 인스턴스를 다시 생성하고 컴파일한다. 초기 학습률을 출력하여 확인할 것이다.
이제 skeculer 함수에 적용하고자 하는 학습률 감소 로직을 구현한 뒤에 LearningRateScheduler 객체에 적용한다.
하지만 이런 오류가 뜨고 있다. 이 오류는 학습률 스케줄러에서 반환되는 값이 float 타입이어야 하는데, 현재 반환된 값이 float 타입이 아닌 것으로 인식되어 발생하는 문제이다. 이는 lr_scheduler의 스케줄 함수가 float 값을 반환하도록 보장하지 않기 때문이다.
이 코드를 몇 번이나 수정하며 실행하는지 모르겠다. 버전이 바뀌면서 이전에는 사용되었던 변수가 사용할 수 없게 되기도 하고 아무튼 복잡하다.
학습률이 감소하여 10 epoch 훈련이 완료된 후에는 최종 학습률이 0.01로 감소한 것을 확인할 수 있다. scheduler 함수에 구현한 로직을 수정하여 학습률 감소 크기나 시점을 다르게 하여 적용할 수 있다.
4. 텐서보드(Tensorboard)
텐서보드는 훈련에 대한 시각화를 실시간으로 제공하는 유용한 도구다. 시각화 라이브러리인 matplotlib이나 seaborn으로 평가지표를 시각화하는 방법으로 History 객체를 활용하는 방법을 학습했었다.
텐서보드를 활용하면 epoch별 훈련 손실 및 평가 지표를 시각화해 차트로 보여주는 것은 물론이고 모델의 구조를 시각화해 보여주거나 레이어의 가중치 분포를 시각화로 제공한다. 또한 모델 훈련 시 시각화 차트를 실시간으로 업데이트해 제공하는 기능도 포함하고 있다.
텐서보드 시각화를 위해 tensorflow.keras.callbacks.TensorBoard() 객체로 생성하여 콜백 매개변수에 적용하면 된다. 가중치 초기화를 위해 모델 인스턴스를 다시 만들어 주는 점에 유의한다.
훈련이 완료된 후 노트북의 매직 커멘드를 입력하여 텐서보드를 바로 출력할 수 있다.
학습을 마치고
이번 학습에서는 책과 코드가 많이 달라서 코드를 여러 번 수정하느라 조금 어렵기도 했다. 하지만 난 문제가 발생하고 오류를 수정하는 이런 과정이 결코 두렵지 않고 오히려 즐겁다. 그리고 그래프를 확인하는 것도 재미있고, 특히 마지막에 사이트를 불러와서 epoch 상태를 확인하는 부분이 가장 재미있었다.
밖에서는 아침부터 밤 늦게까지 외부 행사가 있는지 많이 소란스럽지만 그래도 공부하기에 좋은 날이다.
'인공지능 > 딥러닝' 카테고리의 다른 글
케라스 8 - 복잡한 모델 생성 (0) | 2024.10.26 |
---|---|
케라스 7 - 모델 저장 및 불러오기 (0) | 2024.10.26 |
케라스 5 - 모델 세부 설정 (0) | 2024.10.26 |
케라스 4 - 심층 신경망으로 이미지 분류 (1) | 2024.10.26 |
케라스 3 - 단순 신경망 훈련 (0) | 2024.10.26 |