Home [fast.ai] Tutorial - Single-label Classification
Post
Cancel

[fast.ai] Tutorial - Single-label Classification

1. 필요한 모듈 import

공식 홈페이지에서 모듈을 import 할 때 구분하지 않고 한 번에 전부 불러와서 사용하기 때문에 가독성이 떨어지는 문제가 있었습니다. 그래서 저는 official GitHub을 통해 필요한 모듈들을 찾아 직접 import 하는 방식으로 진행했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Official GitHub
from fastai.vision.all import *

# TODO
import fastai

from fastai.callback.schedule import fine_tune

from fastai.metrics import error_rate

from fastai.data.external import untar_data, URLs
from fastai.data.transforms import get_image_files

from fastai.vision.data import ImageDataLoaders
from fastai.vision.augment import Resize
from fastai.vision.learner import vision_learner
from fastai.vision.models.tvm import resnet34

필요한 모듈들을 찾으면서 헷갈릴 수 있는 부분을 발견했습니다. ➡️ fastai.vision.data에서 fastai.data를 import 하기 때문에 fastai.vision.all을 import 하면 fastai.data에 있는 모듈들을 사용할 수 있게 되어 있습니다.

2. Loading data

제공되는 데이터를 사용하기 위해서는 untar_dataURLs를 사용하면 됩니다. untar_data의 반환 값은 Path객체이며 정확히는 pathlib.PosixPath로 반환 됩니다.

💭 아마 URLs에 존재하는 확장자가 대부분 .tar이기 때문에 .tar을 압축 해제한다는 의미에서 untar_data라는 method name이 붙은 것 같습니다.

untar_data를 통해 기본적인 경로를 가져오고 나서 이미지가 있는 폴더에서 필요한 이미지를 가져오기 위해 get_image_files라는 method를 사용합니다.

1
2
3
4
5
6
7
path = untar_data(url=URLs.PETS)
files = get_image_files(path=path/"images")

print(files[0])
  >> "/root/.fastai/data/oxford-iiit-pet/images/havanese_178.jpg"
print(len(files))
  >> 7390

fast.ai의 ImageDataLoaders을 통해 dataloader를 만들 수 있습니다.

그 중에서도 files를 보고 label을 판단하도록 하는 from_name_func method를 사용했습니다.

from_name_funclabel_func는 string type을 입력받아 label을 반환해주는 함수입니다. (해당 task에서 label은 cat-True / dog-False 입니다.)

1
2
3
4
5
dls = ImageDataLoaders.from_name_func(path=path,
                                      fnames=files,
                                      # 고양이 이미지의 파일명 첫 글자가 대문자 / 강아지 이미지의 파일명 첫 글자가 소문자
                                      label_func=lambda x:x[0].isupper(),
                                      item_tfms=Resize(224))

3. Sample Image 살펴보기

show_batch()를 통해 labeling과 transform이 잘 되었는지 확인할 수 있으며 해당 method는 최대 10개까지 확인할 수 있습니다.

1
dls.show_batch()

4. Training

4.1 Learner 준비

vision_learner를 통해 학습에 필요한 것들을 설정할 수 있습니다. 예를 들면, optimizer, initialization이 있습니다. 또한 대부분의 argument들의 값이 자주 사용하는 값으로 설정되어 있어 편리합니다.

torchvision에서 제공하는 모델을 가져와 사용하고 싶다면 fastai.vision.models.tvm에서 모델을 불러와 사용할 수 있습니다.

1
2
3
learn = vision_learner(dls = dls,
                      arch = resnet34,
                      metrics=error_rate) # error_rate = 1 - accuracy

4.2 Fine-tuning

Learner의 fine_tune method를 사용해 학습을 시작할 수 있습니다.

fine_tune에는 미세 조저이 필요한 세부 파라미터들을 설정할 수 있는데 대표적으로 epochs, base_lr, lr_mult 등이 있습니다.

fine_tune의 결과 값은 (epoch, train_loss, valid_loss, error_rate, time)순으로 확인할 수 있습니다.

1
2
learn.fine_tune(epochs=1)
  >> [0, 0.05005466565489769, 0.015708547085523605, 0.004736130125820637, '00:52']

Prediction & Result

Learner의 predict method를 사용해 결과를 확인할 수 있고 (label, index, probability) 순으로 반환 해줍니다.

1
2
learn.predict(files[0])
  >> ('False', tensor(0), tensor([1.0000e+00, 5.8280e-08]))

또한 위에서처럼 이미지와 함께 보고 싶다면 learn.show_results()를 사용해 볼 수 있습니다.

※ Reference

This post is licensed under CC BY 4.0 by the author.

[fast.ai] fast.ai Overview

[백준] 2230번 수 고르기 - Python