서울ICT이노베이션스퀘어 - 인공지능 고급과정(시각지능) 11일 차

※ Notification
본 포스팅은 작성자가 이해한 내용을 바탕으로 작성된 글이기 때문에 틀린 부분이 있을 수 있습니다.
잘못된 부분이 있다면 댓글로 알려주시면 수정하도록 하겠습니다 :)

Intro

오늘은 지난시간에 진행했던 GTSRB 프로젝트를 마무리하고, 그동안 학습한 CNN을 이용해 kaggle의 Surface Creack Detection 프로젝트 실습을 진행했다.
그리고 전이학습의 이론과 간단한 예제코드를 돌려보았다.

GTSRB train/test directory

지난 시간에 이야기한 것처럼 원본 이미지를 train / test 디렉토리에 별도로 저장한 후에 train / test 디렉토리를 통해서 학습을 진행했다.

GTSRB
 |- train
     |- 00000
     |- 00001
     |- .....
     |- 00042
 |- test
     |- 00000
     |- 00001
     |- .....
     |- 00042

train / test 디렉토리를 이용하기 위한 과정은 다음과 같다.

  • 원본 데이터를 train 디렉토리로 복사
  • test 디렉토리 생성 및 하위 디렉토리 생성
  • train 데이터에서 split ratio만큼 test 데이터로 이동
  • IO 과정에서 오류가 발생하지 않았는지 검증
  • 이후 Direct 방식과 동일하게 전처리 및 모델 학습 진행

크게 어려운 부분은 없었고, IO 과정에서 데이터 누락은 생각해본적도 없었는데 생각해보니까 그럴 수도 있겠다 싶었다.
또한, 원본 데이터를 copytree를 통해 통째로 복사하는게 훨씬 더 빠르다고 한다.
처음에 원본 데이터에서 train / test 폴더로 이동하는 것을 생각했었는데 어차피 이동할거면 위 방법이 훨씬 효율적인 것을 알게 되었다.

Project

프로젝트 보고서 관련해서도 설명해주셨는데, 마침 토이 프로젝트를 기획중이라 도움이 될만한 내용이 많았다.

  • 어떤 프로젝트인지, 어떤 데이터를 사용했는지
  • 팀 구성, R&R(Role and Responsibilities)
    - 데이터 수집이라고 한다면 크롤링, 다운로드 이런 부분까지 자세하게 작성
  • 데이터 출처 및 구성
  • 프로젝트 목표, 소스, 개발환경, 개발 단계별 수행 방법 및 소요시간
  • 모델 아키텍처 및 선정이유
  • 프로젝트 진행 시 시행착오 및 문제점
  • 프로젝트 개선사항 (자아비판)

나머지 부분은 크게 설명할 것이 없겠지만 몇 가지만 좀 더 적어보겠다.

  • 개발 환경
    python, numpy 버전 등을 명시해야 한다.
    버전이 다르게되면 동작하지 않을 가능성이 있기 때문에.
    -> 실제로 이런 부분 때문에 도커를 많이 사용한다고 알고 있다.

  • 개발 단계별 수행 방법 및 소요시간
    이 부분은 크게 생각해보지 못했던 부분인데 단순히 전체적인 프로젝트 기간이나 큼지막한 단계별 기간만 생각했었다.
    하지만, 데이터 전처리하는 시간, 아키텍처를 설계하고 학습하는 시간, 테스트 및 디버깅하는 시간 등을 고려하지 않는다면 제대로 된 프로젝트라고 이야기 할 수 없다고 하셨다.
    현업에서는 같은 과정을 반복해서 실행해야할 수 있고, 기간이나 자원을 배치함에 있어서 중요한 자료이기 때문이다.

  • 모델 아키텍처 및 선정 이유
    단순히 사람들이 많이 사용하기 때문에 사용했다는 것은 이유가 될 수 없다.
    10가지 모델을 돌려봤을 때 해당 아키텍처가 좋았다든가 하는 이유가 있어야 한다.

Surface Crack

GTSRB 프로젝트가 끝나고 이전에 배웠던 내용을 토대로 kaggle의 Surface Crack project를 진행했다.
train / test 디렉토리 생성을 통한 모델 학습, 정확도를 99% 이상으로 유지하면서 overfit을 줄이는 작업을 진행했다.

이 과정에서 loss 그래프가 부드럽지 않게 나왔고, learning rate를 통해 좀더 Smooth한 곡선을 볼 수 있었다.

Adam의 기본 learning rate는 0.001이고, 1e-3이다. 오늘까지도 1e-4가 0이 몇 개인지 헷갈려서 이번 기회에 확실하게 기억하고 넘어가기로 했다.

Transfer learning

Cats and Dogs Dataset

먼저 Cats and Dogs dataset으로 모델을 돌려보라고 하시면서 학습이 잘 되지 않을 텐데 그 이유가 무엇일지 생각해보라고 하셨다.

처음에는 단순히 앞의 데이터셋들에 비해서 사진의 크기(픽셀의 수)가 커서 이미지 사이즈를 줄여주면 된다고 생각했다. 하지만 이미지 크기를 변경해도 그래프는 아주 흥미로운 모양을 보여줬다.

다른 이유를 생각해보던 중 수업이 진행되었다. 해답은 데이터에 있었다.
MNIST나 GTSRB 등의 데이터는 최소 10000만 개 이상이었는데 Cats and Dogs dataset은 2000개 밖에 되지 않았다. 사진 크기 변경할 때 shape를 찍어보긴 했는데 크기 바꾸는 것에 정신이 팔려있어서 미쳐 보지 못했다.

데이터의 양이 적으면 아무리 모델을 잘 구성한다고 해도 좋은 성능을 기대하기가 힘들다.
한정된 데이터로 모든 데이터에 알맞는 w와 b로 일반화하기 어렵기 때문에.

Transfer learning

앞에서도 봤듯이 모델 학습에 있어서 데이터의 양이 중요한데, 알다시피 양질의 데이터를 모으는 일이 여간 쉬운 것이 아니기 때문에 Transfer learning을 사용한다.

이미지의 특징을 쪼개고 쪼개다보면 어떤 이미지에 가져다놔도 쪼갠 특징으로 적용할 수 있다. 이러한 관점에서 봤을 때 사전에 많은 양의 데이터로 학습된 좋은 모델을 가져와서 우리가 원하는 데이터로 아주 약간씩 특징을 변화시켜준다면 모델을 처음부터 학습시키지 않고도 좋은 성능을 낼 수 있다.

Fine tuning

Fine Tuning이란 기존의 설정되어있는 특징값을 아주 미세하게 조정해주는 것을 말하며, 문자 그대로 미세 조정이라고 한다.
Fine Tuning에서 Tine은 1번의 좋은이 아니고 4번의 미세한이다.

기존에 학습된 가중치를 해치지 않으면서 적용하려는 데이터셋의 특징을 반영하기 위함이므로 가중치를 아주 미세하게 조절해 나가는 것이다.
때문에 일반적으로 learning rate은 1e-4 ~ 2e-5 사이의 값을 적용하는 것이 좋다. 꼭 그렇다는 건 아니지만 어쨌든 미세하게 학습을 진행해야 한다는 뜻.

mobilenet = MobileNet(weights='imagenet', include_top=False, input_shape=(224,224,3))

model = Sequential()

model.add(mobilenet)
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(2, activation='softmax'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer=Adam(2e-5),
              metrics=['acc'])
model.summary()

앞선 코드에 Transfer learning을 적용해 보았다.
include_top 옵션을 통해 맨 위에 분류층이 포함되지 않게 한다. 즉, Feature extractor 부분만 가져오는 것.

결과는 다음과 같다.
아주 좋은 성능을 보여주지 못하지만 몇몇 모델은 조금만 수정하면 좋은 모델이 될 것 같다.
뭘하든 아까의 그래프보다는 보기 좋다.
다양한 Pre-trained model이 있지만 강사님께서는 Xception과 MobileNet을 선호하신다고 하셨다.

Note

  • IO 과정에서 데이터가 누락될 수 있으니 확인하는 습관을 기르자.
  • 원본 데이터는 copytree로 통째로 복사하자.
  • 프로젝트 보고서에는 개발 환경, 단계별 방법 및 시간, 모델 선정 이유 등이 들어가야 한다.
  • 1e-3 == 0.001
  • 그래프의 굴곡이 너무 심하다면 learning rate을 줄여주자.
  • Transfer learning과 Fine tuning은 세트

Outro

요즘들어 꾸준히 코딩하는 것에 대한 중요성을 많이 느끼고 있다.
한번 보고 넘어간 코드도 다시한번 보는 습관 기르기, 학습한 코드들을 내 것으로 만들기.

좋은 웹페이지 즐겨찾기