fastai 라이브러리는 pytorch를 기반으로 만들어졌기 때문에 GPU 연산을 지원합니다. 그렇기 때문에 실습 시 GPU를 갖춘 클라우드 서버 환경을 준비하신다면, 원활한 실습을 진행하실 수 있습니다. 이에 적합한 환경은 구글에서 제공하는 **Colab**으로 기본적으로 fastai 라이브러리가 이미 설치되어 있기 때문에, Colab 환경에서 실습을 진행하였습니다.
Colab GPU 셋팅
우선 Colab에서 제공하는 GPU를 사용하시려면, 런타임 > 런타임 유형 변경 을 클릭하시고 노트 설정이 뜨면, 하드웨어 가속기를 GPU로 설정해주시면 됩니다.
Google Drive 연동
다음은 구글 드라이브 연동 과정입니다.
이번 실습에서는 크게 중요하지 않지만, 앞으로 구글 드라이브에서 데이터를 읽어오고 결과를 저장하는 등의 작업을 하기 위해서는 구글 드라이브와의 연동이 필수적입니다.
2020년 7월 15일 기준으로 fastai 라이브러리 이용시 많은 경고 메세지가 발생하는 것을 확인하실 수 있습니다. 이는 Pytorch의 버전에 따른 문제로, 다음의 코드로 Pytorch를 설치해주시면 경고 메세지 없이 사용하실 수 있습니다.
1
!pip install "torch==1.4""torchvision==0.5.0"
1. fastai Quick Start
앞서 말씀드린 것처럼 이번 글에서는 강아지와 고양이의 품종 분류 문제를 풀기 위해 이미지 데이터를 활용합니다. 즉 이미지 분류(Image Classification)인데 fastai는 크게 3단계의 프로세스로 진행됩니다.
데이터 준비 (DataBunch)
모델 생성 및 학습 (Learner)
모델 해석 (ClassificationInterpretation)
1.1. 데이터 준비
사용할 데이터는 O. M. Parkhi et al., 2012에서 사용된 Oxford-IIIT Pet Dataset 데이터입니다. 이 데이터는 12종의 고양이와 25종의 개를 가지고 있고, 만들어볼 모델은 이러한 37가지의 다른 종들을 구별해 낼 것입니다. 해당 논문의 연구결과에 따르면, 2012년 기준 가장 높은 정확도는 59.21% 였습니다. 이는 “이미지”, “머리”, 그리고 “몸"을 사진으로부터 분리해서 만들어낸 다소 복잡한 모델의 성능입니다.
fastai 에서는 Pytorch 공식문서에서 제공하는 예제 데이터나 기타 여러 데이터들을 쉽게 다운로드 받을 수 있도록 untar_data 함수와 URLs 클래스를 제공하고 있습니다. 이 untar_data 함수에 URLs에 속한 url을 인자로서 넘겨주면, 자동으로 데이터를 다운 받고 추출(untar)하게 됩니다.
기존 강의 자료에서는 ConvLearner 라고 나와있는데 cnn_learner 로 변경되었습니다.
1
learn.fit_one_cycle(4)
손쉽게 약 92%의 정확도를 가지는 품종 분류 모델을 생성하였습니다!
1
2
# 자신이 원하는 경로에 학습 결과를 저장할 수 있습니다.learn.save(base_dir/'stage-1',return_path=True)
저장된 pth 파일
1.3. 모델 해석
fastai 라이브러리는 모델을 학습하는하는 것에서 끝나는 것이 아니라, 이를 분석할 수 있는 기능 또한 포함하고 있습니다.
학습이 완료된 Learner 를 ClassificationInterpretation.from_learner() 에 입력하여 생성합니다.
1
2
3
4
5
interp=ClassificationInterpretation.from_learner(learn)losses,idxs=interp.top_losses()len(data.valid_ds)==len(losses)==len(idxs)# 해석에는 validatoin set 을 사용함
Confusion Matrix를 이용하면 한눈에 어느 클래스들 간에 혼동이 잦았는지에 대해서 파악할 수 있습니다.
1
interp.most_confused(min_val=2)
2. fastai Advanced Start
이번 섹션에서는 앞서 학습한 모델의 성능을 높일 수 있는 방법에 대해서 알아보고자 합니다.
2.1. Unfreezing and fine-tuning
unfreezing은 사전학습 파라미터들을 파인튜닝(fine-tuning)하기 위해 사용됩니다. 처음에 사전 학습 파라미터를 사용하는 Learner를 생성하게 되면 마지막단에서 분류를 진행하는 레이어만 학습을 통해 파라미터가 조정됩니다. 즉, 이미지의 특징을 잡아주는 Convolution 레이어는 잠겨있는데, unfreeze() 함수로 잠금장치를 풀어주는 것과 같습니다.
fastai 는 적합한 학습률(learning rate)를 찾아주는 lr_find() 함수도 제공하고 있습니다.
lr_find는 학습률을 점점 올려가면서 손실에 관한 탐색을 진행하고, 발산하게 되면 탐색을 멈추게 됩니다.
본격적인 파인튜닝을 위해 다시 이전에 학습된 결과를 불러오겠습니다.
1
learn.load(base_dir/'stage-1');
1
learn.unfreeze()
1
2
3
# 학습률 탐색 및 시각화learn.lr_find()learn.recorder.plot(suggestion=True)## 어느 부분이 적합한지 추가로 표시
1
learn.fit_one_cycle(2,max_lr=slice(1e-6,1e-4))
2.3. Change Architecture
Deep Learning은 층이 깊어질 수록 더욱 해당 Task를 잘 학습하는 방향으로 발전하게 되었고, 가장 대표적인 아키텍쳐는 ResNet일 것입니다. 이 아키텍쳐는 층이 깊어질수록 성능이 떨어졌던 기존의 아키텍쳐들의 문제를 해결하여 층이 깊어질수록 더 좋은 효과를 내고 있습니다. ResNet에 대해서는 차후의 강의에서 더욱 심도깊게 다룰 것이고, 지금은 품종분류에서 더 좋은 성능을 낼 수 있도록 34층(resnet34)에서 50층(resnet50)으로 아키텍쳐를 바꿔서 학습을 해보도록 하겠습니다. 혹시 이에 관한 읽을 자료가 필요하시다면 이미지 분류 모델의 발전 과정에 대한 블로그 포스트를 참조하시면 좋을 것 같습니다.
더욱 깊어진 아키텍쳐로 인해서 GPU 메모리가 부족하다는 경고를 보게 된다면, batch 사이즈를 줄여서 이를 해결할 수 있습니다.
이번 글에서는 강아지와 고양이의 품종 분류 문제를 풀어나가는 fastai Quickstart를 중점적으로 다루었고, 성능 향상을 위한 몇몇 방법들, 그리고 DataBunch를 만들기 위한 다양한 방법들에 대해서도 알아보았습니다.
fastai 사용해보면서 느낀점은 모델링 작업을 하다보면 편의상 필요로 하는 부분들을 잘 구현해주어 보다 쉬운 사용이 가능하다는 것입니다. 또한 뒤에서 자세하게 다루겠지만, 전이학습(Transfer Learning) 및 One Cycle Policy가 잘 적용되어 있어서 대부분의 상황에서 좋은 모델 결과를 기대할 수 있습니다.
fastai 시리즈는 강의를 기반으로 하지만, 포스팅 순서는 강의의 순서를 따르지는 않습니다. 앞으로의 포스팅 순서에 대해서 간략하게 말씀드리면 이번에는 이미지 분류 문제만을 다루어 보았는데, 이미지 데이터를 활용한 더욱 다양한 방법론들을 다루어 볼 것입니다. 다음으로는 테이블 데이터의 활용과 추천 시스템, 그리고 자연어 처리 (Natural Language Processing)의 순서로 진행할 예정입니다.