[13일 차] Brain tumor classification - Transfer learning, Small dataset

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

Intro

글 제목의 형식을 바꿔봤다. 해당 일자에 배운 내용을 대표할 수 있는 단어들로 최대한 작성하는 것이 나중에 글을 찾아볼 때 편리할 것 같아서이다.
오늘은 ImageDataGenerator로부터 Validation_generator를 만드는 법을 간단하게 배우고, Kaggle 문제를 풀었다.

Validation data generator

Kaggle 문제에 앞서 ImageDataGenerator를 통해 Validation을 만드는 실습을 해봤다.

train_data_gen = ImageDataGenerator(rescale=1./255, 
                                    rotation_range=10, width_shift_range=0.1, 
                                    height_shift_range=0.1, shear_range=0.1, 
                                    zoom_range=0.1, horizontal_flip=True,
                                    validation_split=0.2)

validation_data_gen = ImageDataGenerator(rescale=1./255, validation_split=0.2)

test_data_gen = ImageDataGenerator(rescale=1./255)

먼저 각각의 ImageDataGenerator를 선언해주고 이를 통해 디렉토리에서 데이터를 불러온다.


train_generator = train_data_gen.flow_from_directory(train_dir, batch_size=32, 
                                                color_mode='rgb', class_mode='binary',
                                                target_size=(IMG_WIDTH,IMG_HEIGHT),
                                                subset='training')

validation_generator = validation_data_gen.flow_from_directory(train_dir, batch_size=32, 
                                                color_mode='rgb', class_mode='binary',
                                                target_size=(IMG_WIDTH,IMG_HEIGHT),
                                                subset='validation')

test_generator = test_data_gen.flow_from_directory(test_dir, batch_size=32, 
                                              color_mode='rgb', class_mode='binary',
                                              target_size=(IMG_WIDTH,IMG_HEIGHT))

subsettrainingvalidation으로 지정해주면 된다.

Kaggle - Brain tumor

Kaggle 데이터의 경우에 Colab에서 데이터를 직접 다운로드 하려면 토큰이 필요한데, 이 과정이 번거롭기 때문에 데이터를 다운로드하고 구글 드라이브에 올려서 사용하라고 하셨다. 이전에 토큰을 설정했던 적이 있어서 그렇게 진행하면 될 것 같았지만, 오늘은 왠지 kaggle notebook을 사용해보고 싶어서 사용해봤는데 결론은 영 불편했다.

데이터를 다운받고 하는 번거로움은 없었지만, 입력 셀이 화면 제일 하단에 위치하는 것과 동일한 단어를 한번에 변경하는 단축키를 사용하지 못해서 불편했다.
단축키는 찾아보면 나올 것 같았지만 입력 셀이 밑에 노출되어 코딩하기가 불편했다. 그래서 다음부터는 그냥 Colab 사용하기로 다짐했다.

https://www.kaggle.com/datasets/sartajbhuvaji/brain-tumor-classification-mri

Brain tumor competition을 진행했는데 그동안 배운 것을 토대로 진행해보고 문제가 발생한다면, 발생하는 문제에 대해서 생각해보라고 하셨다.
데이터셋이 다음과 같이 디렉토리로 label이 구분되어 있으므로 ImageDataGenerator를 사용했고, train dataset의 20%를 validation으로 사용했다. 그러나 이것은 매우 큰 실수였다.

Transfer learning(MobileNet)으로 진행했는데 모델을 돌렸을 때 train_acc은 95% 가까이 나오는 반면, val_acc이 심각할 정도로 낮았고 test_acc 역시 train에 한참 못 미치는 수치였다.
MLP 부분을 간단하게 설계했기 때문에 MLP의 아키텍처 설계가 잘못된 것일까 하고 여러가지를 변경해봤지만 소용이 없었다. 원인을 한참 찾던 중 시간이 끝나서 일단은 수업을 들었다.

수업이 다 끝나고 혼자 돌려보다가 겨우 깨달았는데, Brain tumor Dataset의 경우 Train Data의 개수가 label별로 1,000개도 되지 않아서 Validation이 무의미했던 것이다. 가뜩이나 없는 데이터를 또 반으로 나눠놨으니 정확도가 절대 잘 나올 리가 없었다.
또한, validation을 사용하지 않았다고 해도 train에 비해 test의 수치가 월등히 낮았는데, 그 이유는 train과 test의 데이터들이 균형있게 나눠지지 않았기 때문이다.

Data mix-up

모델이 종양을 잘 발견하기 위해서는 다양한 데이터에 대해 일반적으로 잘 맞추는 모델이 완성되어야 하는데 Train Dataset에는 A, B 종양만 있고, Test Dataset에는 C, D 종양만 있는 식이어서 Train Dataset으로 아무리 잘 학습을 시킨다고 한들 Test Dataset을 잘 분류하지 못하는 것이다.

이런 데이터에서 Train Accuracy와 Test Accuracy를 통해서 Insight를 얻을 수 있는데 Train Accuracy가 99% 가까이 학습이 잘됐는데 Test Accuracy가 이에 한참 못미치는 수준이라고 한다면 Train Dataset과 Test Dataset이 적절히 나뉜 것인지 생각해봐야 한다.

이런 경우에 Train Dataset과 Test Dataset에 대한 확인이 필요한데, 의학이나 건축 등과 같이 Domain knowledge를 요구하는 데이터의 경우에는 데이터가 적절히 나뉜 것인지 알기가 힘들다. 따라서 Train과 Test 데이터를 합친다음 섞어주고 다시 Train과 Test로 나누어주는 작업이 필요하다.

위 그래프들이 Data를 섞기 전 그래프이고 아래 그래프들이 데이터를 섞어준 후의 그래프이다.

Insight

Brain tumor Competition을 진행하면서 얻을 수 있는 Insight를 몇 가지를 설명해주셔서 정리해본다.

  • 파일 구조가 label Directory 형식으로 되어있으므로 ImageDataGenerator를 사용(ImageDataGenerator 사용 근거)
  • 전체 데이터 개수가 각 label별로 1,000개도 되지 않기 때문에 Trainsfer learning을 생각해야함 (Transfer learning 사용 근거)
  • validation의 정확도와 test의 정확도를 비교 → 어림잡아서 비슷하면 일단은 Max Accuracy가 그리 높지 않을 것이라고 생각할 수 있음
  • Train 데이터로 학습이 아주 잘 됐는데 test 결과 값이 좋지 않다는 것은 overfitting이 많이 발생한 것이므로 처리가 필요함
  • 의학, 건축 데이터의 경우 시각화해서 결과를 본다고 해서 어떤 데이터를 처리해줘야할 지 모르기 때문에 Train과 Test데이터를 섞어줌으로써 overfitting을 줄임

Note

글을 정리하면서 Train Test를 섞는 내용을 작성하다가 overfitting이 많이 발생해서 Train Test를 섞는 것이라면, 다른 데이터들에서도 overfitting이 발생할 때 Dataset을 섞으면 되지 않나? 하고 생각했는데, 일반적으로 그렇게 하지 않는 것 같아서 찾아보던 중에 정리가 되었다.
다른 데이터셋에서는 label에 대한 판단을 할 수 있기 때문에 확인해보고 처리를 하면 되는데 의학이나 건축과 같이 Domain knowledge를 요구하는 데이터에서는 그러기가 쉽지 않기 때문에 Train과 Test를 섞는 것이다.

Outro

수업할 때는 내용이 별로 없어서 몇 가지만 이해하면 되는줄 알았는데 막상 정리를 하다보니 그 몇 가지에서 많은 Insight를 얻을 수 있었다.
까먹지말고 항상 데이터의 개수를 확인하는 습관을 길러야겠다.

좋은 웹페이지 즐겨찾기