딥러닝 이미지 분류에서의 데이터 부족 문제
이미지 분류를 딥러닝을 이용해 시도하려 는데 데이터가 부족하면 제 성능을 발휘할
수 없다고 알고있다. 머신러닝과 달리 딥러닝은 이미지의 특성을 자동으로 추출하여서 데이터가 많을수록
모델이 커질(깊어질)수록 성능이 증가한다. 특별히 영상과 같이 매우 고차원의 입력 샘플들이 사용되는 경우에는 더욱이 많은 데이터를 통한 특성 자동추출이
필요하다. 하지만, 주위에 훈련하려는 관련 이미지가 수 만장
혹은 수 십 만장 준비되어 시작하는 경우는 쉽지 않은 것이 현실이다.
컴퓨터비전에서 딥러닝은 본질적으로 대상의 적용에 있어 다목적인 적용이 가능하다. 컴퓨터비전에서 놀라운 성능을 발휘하는 합성곱(convolutional) 신경망은
첫째, 이미지의 어느 한 부분에서 학습된 패턴을 이미지의 어디에서나 동일하게 인지하는 번역 불변(translation invariant) 특징 덕분에 적은 훈련 샘플로도 효율적인 인지 능력을 보여준다. 둘째,
합성곱 신경망은 첫번째 층에서 모서리와 같은 작은 지역 패턴을 학습하고, 두번째 층에서는
첫번째 패턴 들로부터 만들어진 보다 큰 패턴을 학습하는 것과 같은, 패턴의 공간 계층성(spatial hierarchies)을 학습하기 때문에, 완전연결층의
경우에는 전체 이미지로부터 특정 패턴을 인식하는 반면, 합성곱 신경망은 소규모 필터가 합성곱을 수행하는
국지적 지역의 학습을 통하여 완전연결층에 비해 훨씬 적은 파라미터로 이미지 분류가 수행되어 효율적이다.
소규모 데이터로 딥러닝을 시도할 때 고려할 점
수십개의 이미지 데이터 샘플로 복잡한 합성곱 신경망 훈련을 시도하는 것은 불가능할
것이지만, 만약 작업이 간단하고 모델이 작으며 일반화가 잘 되었다면 수백장의 이미지 데이터로도 가능할
수 있다. 예를 들어, 2,000 장 정도의 개와 고양이
사진 데이터들을 가지고 합성곱 신경망 훈련을 맨 처음부터 일반화(regularization)없이 시도한다고
하면, 약 70% 정도의 분류 정확도를 보여준다. 이 경우, 일반화 고려가 없었기 때문에 과적합(overfitting)이 발생한다. 데이터증식(data augmentation)을 통하여 정확도를 80-85% 정도까지
끌어 올릴 수 있다. 그 다음에 생각할 수 있는 방법이 대용량의 데이터를 기반으로 이미지분류에 사전
학습된 모델을 활용하는 전이학습(transfer learning)이다.
여기에는 사전 학습된 모델의 특징 추출(feature extraction)을 사용하는 방법과, 여기에 더해서 사전 학습된 모델을 미세 조정(fine-tuning)하는
방법이 있다. 전자의 feature extraction 방법을
통하여 97% 이상의 정확도를 나타낼 수 있고, fine-tuning을
통하여 98% 이상의 정확도를 나타낼 수 있다.
전이학습(transfer learning)
딥러닝에서 가장 강력한 아이디어 중에 하나는, 한
작업에 대해 학습을 이미 한 경우에, 그 지식을 다른 종류의 작업에 적용할 수 있는 것이다. 예를 들어, 신경망이 고양이와 같은 사물을 인식하도록 학습되었다면, 이 작업을 x-ray를 분류하는데 적용할 수 있다는 뜻이다. 마치 거인의 어깨위에서 세상을 보듯, 인터넷상에 공개된 대용량 데이터세트를
컴퓨터비전 전문가들이 그들의 알고리즘들을 통해 사전 훈련시켜 놓은 ImageNet, MS-COCO, Pascal
등과 같은 사전훈련 모델들을 다운로드 받아 사용할 수 있다고 생각해보자. 예를 들어, 2015년 ImageNet 대회 ILSVRC에서
선보인 Resnet[1]의
경우 신경망의 층이 152개 층으로 이루어져 있다. ImageNet 대회는
약 1,000 개 카테고리(개, 자전거 등의)의 이미지 140만개로
구성된 데이터 들로부터 이미지 분류 성능을 겨루는 대회이고 2015년 Resnet의 경우 정확도가 96.4%를 자랑한다. Resnet50 은 신경망 층이 50층으로 전이학습에 많이 사용되는
사전학습 모델이다. 이러한 사전학습 모델은 통상 훈련에 몇 주가 걸리기도 하며 수많은 GPU를 사용한다. 자 그럼, 개와
고양이 이미지 분류의 경우를 예로 들어 이러한 사전훈련 모델을 어떻게 사용한다는 것인지 살펴보자.
2,000 장의 개와 고양이 이미지샘플로 시작하는 이미지 분류
우선 2013년 Kaggle 컴퓨터비전 대회에서
사용된 Dogs vs. Cats[2]
데이터세트로부터 다운로드 받은 25,000개의 개와 고양이 사진을 다운로드 받는다. 이중 train 디렉토리 밑에 cat
과 dog 밑에 해당되는 고양이와 개 이미지를 1,000
개씩 할당한다. valid 디렉토리와 test 디렉토리에도
밑에 cat 과 dog 에 각각 500 개씩 이미지를 할당한다.
아래 그림1과 같이 Keras 의 image_dataset_from_directory 를 이용하여 디렉토리에 있는 이미지들을 읽는다. train_dataset 에 2,000 개 파일이 고양이, 개의 2개 class 로
구성되어 있음을 알 수 있다. valid_dataset 은 1,000개
test_dataset도 1,000개를 보유함을 확인할 수
있다.
<그림 1. Keras의 image_dataset_from_directory를 이용한 image road>
baseline모델 구축
아래 그림 2와 같이 Keras 를 이용하여 ①
텐서플로우의 분산훈련 전략인 tf.distribute.MirroedStrategy() 를 통한 분산훈련
사용 ② 180x180 픽셀의 3 채널(RGB) 이미지를 입력으로 정의 ③픽셀당 보유하고 있는 0~255 까지의
값들을 255로 나누어 줌으로써 0~1 사이의 값들을 가지도록
rescale 해준다. 그리고 이어서 5개의 Conv2D 층과 ’relu’
activation 그리고 MaxPooling2D가 이어지는 층이 180x180 특성맵(feature map)을 7x7 까지 줄여준다. 반면 특성맵의 깊이는 32에서 256으로 는다. ④
Flatten을 통하여 2차원 특성들을 일차원으로 변환시킨
후, ⑤ 개 혹은 고양이를 분류하는 2분법 적인 분류(binary-classification)이기 때문에 1개의 unit을 갖는 Dense 층 (1개의
unit 이 0 혹은 1을
담당)에 sigmoid 활성화함수를 쓴다.
아래 그림3과같이 training 과 validation accuracy 를 보면, training은 epoch가 거듭될수록 99% 의 정확도로 수렴하는 한편, validation accuracy는 최고치 75%에 머무르고 있다. 이것이 정확히 training dataset에 모델이 과적합(overfitting)이 일어나고 있음을 보여준다. Validation
loss는 10 epoch 에서 최저점을 찍은 후 반등하고 반면, training loss 는 훈련이 진행됨에 따라 선형으로 감소가 일어난다.
훈련에 2,000개의 비교적 작은 샘플을
사용하여 과적합이 제일 먼저 관심을 두고 지켜봐야하는 제약이다. 이러한 과적합을 피하는 기술로 dropout[3] 이나 weight dacay[4]
를 쓴다. 또다른 방법으로 데이터규모를 늘려서 과적합을 피하는 기술이다. 데이터증식 기술이다.
데이터증식(Data Augmentation)
데이터증식은 기존의 훈련 샘플 들로부터 그럴듯하게 보이는 이미지들을 임의의 몇
가지 변형을 가하여 훈련 데이터를 증식하는 방법을 말한다. 이를 통하여 훈련 기간 동안에 모델이 보다
다양한 데이터에 노출되고 과적합을 방지하는 보다 개선된 일반화에 기여한다.
아래 그림4와 같이, ① RandomFlip(“horizontal”)은 입력이미지의 50%를
수평으로 뒤집는다. ② RandomRotation(0.1) 은
입력이미지를 [-36도,+36도] 범위로 회전시킨다. ③ RandomZoom(0.2)는
입력이미지를 [-20%, +20%] 범위내에서 임의의 비율로 줌인 혹은 줌아웃 한다.
아래 그림5는 훈련 이미지들 중에 데이터 증식이후의 임의의 9개 이미지를 표시한
것이다. 좌우가 대칭을 이루기도 하고 약간 회전 된 것들도 목격되며 줌 인 되고 줌 아웃 된 것들도
보인다.
데이터증식은 소규모 데이터샘플로부터 변형을 가했기 때문에 과적합을 완전히 제거하기에는 부족하다. 아래
그림 5와 같이 ① rescaling 전에 data_augmentation 정의를 포함한다. ② Dense 층 전에 Dropout 을 추가하여 역부족인 과적합방지를
더욱 강화해본다. ③ binary 분류여서 손실은 binary+crossentropy를, 옵티마이저는 rmsprop, metrics 는 accuracy 를 지정한다.
데이터증식과 dropout 을 추가하였으므로 훈련중에 overfitting 이 훨씬
후반부에 일어날 것을 기대하면서 epoch 를 3배 늘려
100으로하여 훈련을 시킨다. 아래 그림 7과 같이, 데이터증식과 dropout
덕분에 과적합이 훨씬 뒤에 일어났다. 데이터증식과 dropout
이전에는 약 10 epoch에서 과적합이 일어나던 것이 60~70
epoch근방에서 발생했다. Validation accuracy가 80~85% 범위에서 일관되게 움직인다. 첫번째 시도 치고는 상당한
향상 (75%->85%) 이다.
지금까지 Kaggle의 Dogs vs Cats 데이터세트로부터
4,000 개의 이미지 샘플을 가지고 텐서플로우 Keras 라이브러리를
이용하여 처음부터 일반화없이 baseline 모델을 구축하여 75%의
validation_accuracy를 확인하였고 데이터증식과 dropout
등을 통해 80~85% 로 향상되는 것을 확인하였다. 소규모
데이터로 딥러닝 이미지분류의 정확도를 향상시키기 위한 다음 단계는, 앞에서 언급한 사전 훈련된 모델을
사용해야만 한다. 다음 2편에서는 이 부분에 대해서 다룰
것이다.
댓글 없음:
댓글 쓰기