프로젝트_랜드마크 - 13일차
Intro
- 지난주 금요일은 코로나 백신 접종으로 인해 프로젝트 작업을 거의 진행하지 못했다.
- 주말 제외하고 하루 1 commit이라는 블로그 초기의 목표가 깨져버려 다소 안타깝다.
- 스스로 나태해지지 않도록, 가능하면 추석 연휴 3일간 프로젝트 작업을 진행해야겠다.
Trouble Shooting
steps 미출력 현상
개요
- numpy 데이터셋을 사용할때와 달리, 훈련 과정에서 epoch당 steps가 출력되지 않는 현상을 확인.
원인
- ImageDataGenerator를 사용하는 경우, Model.fit()에서는 Generator로 생성된 데이터의 개수를 인식하지 못함.
해결
- Model.fit()을 Model.fit_generator()로 변경.
- steps_per_epoch를 (train_data 개수 / batch_size)로 설정
- validation_steps를 (valid_data 개수 / batch_size)로 설정
val_loss의 변화가 없음
개요
- 훈련을 진행하던 도중, 2 epoch부터 val_loss 및 val_accuracy의 변화가 사라짐.
원인
- Dying Relu 현상.
- 활성화 함수중 Relu함수로 인해 발생하는 문제.
- Relu함수는 ForwardPropagation때 음수값이 들어온다면 BackPropagation때 가중치에 0이 곱해져 해당 노드가 죽게 된다.
- 사실, 이런식으로 노드가 죽는 현상은 오히려 Relu의 강점중 하나로 여겨지는데, node를 솎아내어 Overfitting을 방지하는 Drop-Out과 유사한 역할을 하게 된다.
- 다만, 이번 케이스에서는 노드가 전부 죽어버려 문제가 된 것.
해결
- Relu를 보완한 활성화 함수인 PRelu를 모델에 적용
- 하지만 별 성과 없었음.
- 이미지 Data를 crop한 후 데이터셋으로 활용한다면 노이즈가 적어져 더 나은 accuracy를 보이지 않을까 하는 마음에 crop한 이미지를 저장 후 데이터셋으로 활용.
- 역시 별 성과 없었음.
-
더 많은 데이터셋이 해결책이 될 수 있다는 아이디어를 통해 crop된 이미지를 대상으로 데이터 증강을 진행.
- 데이터 증강(Data Augmentation)
- 생각해보면, 내가 데이터셋의 생성에 사용중이던 ImageDataGenerator는 원래 데이터 증강에 사용되던 함수였다.
- 데이터 증강에 관련된 다음의 옵션들을 지정해주었다.
- rotation_range
- width_shift_range
- height_shift_range
- shear_range
- zoom_range
- horizontal_flip
- fill_mode
- 데이터 증강 옵션에 관한 자세한 내용은 이 글에 잘 정리되어 있다.
결과
- Dying Relu 문제가 해결되는것은 물론, 기존의 낮은 accuracy도 2 ~ 2.5배 가량 상승했다.
- 기존 accuracy는 약 28%.
- 무작위 선택의 accuracy가 25%인것 (클래스 4개중 하나가 맞을 확률)을 감안할때 상당히 처참한 편이었다.
- 데이터 증강 후 accuracy는 70%대까지 상승.
- 이미지를 crop하지 않은 데이터로도 실험해본 결과, 약 61%의 accuracy를 기록.