1 minute read

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를 기록.