경 탁

[Fast ai와 파이토치가 만나 꽃피운 딥러닝] #1 본문

- 공부/2. AI

[Fast ai와 파이토치가 만나 꽃피운 딥러닝] #1

김 경 탁 2022. 1. 2. 15:49

  본 포스팅은 한빛미디어에서 나온 fastai & pytorch가 만나 꽃피운 딥러닝에 대한 책에 대해 다룹니다. 
예전에 사이킷런으로 머신러닝을 공부하다가 PYCARET을 알고 나서 충격 먹었던 기억이 납니다.
점점 갈수록 낮아지는 M/L의 진입장벽, 그때 들었던 생각은 딥러닝에 대한 이런 자동화 라이브러리는 없겠지하는 생각이었습니다.
 승선 중 우연히 공부에 대한 자극을 받고자 책을 찾았는데 , 그때 찾았던 도서가 바로 이 책입니다.
딥러닝에 대한 자동화 라이브러리도 벌써 시중에 나왔구나 하는 충격과 함께 공부하리라 다짐했었는데,
선박이라는 고립된 환경, 잘안되는 인터넷 때문에 공부하다가 말았던 기억이 납니다.
 잡소리는 이쯤하고 앞으로 본 서적에 대한 공부와 함께 코드 그리고 문제점 & 해결점을 포스팅할까 합니다.
(주로 코드 위주)

- 코드 설명 

1. 

from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'

1. fastai.vision에 속해있는 모든 라이브러리를 가져옵니다.
2. fast.ai의 데이터 컬렉션에서 데이터셋을 서버에서 다운로드후 , 압축을 해제합니다. 그리고 그 추출된 위치를 PATH라는 객체로 반환합니다.

 

2.

def is_cat(x) : return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

1. 데이터셋에 포함된 파일명의 규치에 따라 고양이 레이블을 지정하는 is_cat 함수를 정의 // x[0]에서 대문자 판단 
2. 이 함수를 통해 fastai에 데이터셋의 종류와 구조화방법을 알려줍니다. (dls)

각각 기능이 궁금하시면 함수 뒤에 (ALT+TAB) 을 누르시면 기능을 알 수 있습니다.
위에서 알 수 있다싶이, 경로지정(PATH)/라벨 지정방식(IS_CAT함수)/ 그외 변형을 할 수 있습니다.
valid_pct : 데이터의 20%는 모델학습에 사용하지 않기. 즉 20%의 데이터를 VALID data set // 나머지 80%를 Train data set으로 두라는 것입니다. -> 과적합 방지 Seed : 코드 실행시 도일한 임의성으로 검증용 데이터셋을 구성하도록 하는 것 -> 아무 숫자나 상관없습니다.

데이터셋 변형에는 두가지 종류가 있는 데, item과 batch이다.
item_tfms : 개별 데이터에 적용할 변형 (가령 위 예시는 각 이미지를 224 * 224의 픽셀로 조정)
batch_tfms : 데이터 배치(뭉치)에 대해 GPU가 빠르게 한번에 처리할 변형 

출처 : https://welcome-to-dewy-world.tistory.com/86

 쉽게 생각해 식빵을 1개씩 굽기 보다는 5개씩 굽는거라고 생각하시면 됩니다.

 

3.

learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)

 합성곱 신경망(CNN)을 생성하고, 이때 사용될 데이터셋과 아키텍처(RESNET34) 그리고 평가지표를 지정합니다.
RESNET34는 CNN의 모델 중 하나로 구조에 있는 계층의 수를 나타냅니다.
대략적으로 숫자가 높아질수록 학습에 더 오랜시간이 걸리고 과적합이 된다고 합니다.
하지만 데이터의 수가 많다면, 더 정확한 결과를 얻을 수 있다고 합니다.

 그외에 평가지표는 검증용 데이터셋을 사용해 예측의 품질을 측정하는 함수로, 보통 매 에포크의 마지막에 출력됩니다.
검증용 데이터셋 중 잘못 분류된 이미지의 비율을 알려줍니다.
많이들 아시는 정확도(accuracy)는 1.0-error_rate입니다.

 그리고 모델을 적합시킵니다. 
우리는 벌써 resnet34로 시작했기 때문에 fit이 아닌 fine_tune(미세조정) 을 사용하면 됩니다.
쯕 fine_tune은 사전 학습된 모델을 새로운 데이터셋에 적응시키는 방법 중 하나입니다.
=> 추가 에포크 동안 사전 학습된 모델의 파라미터를 갱신하는 학습기법 
=> 에포크 : 데이터셋 전체를 한번 통과시켰다는 의미 

 

4.

from fastbook import *
uploader = widgets.FileUpload()
uploader
img = PILImage.create(uploader.data[0])
is_cat,_,probs = learn.predict(img)
print(f"Is this a cat?: {is_cat}.")
print(f"Probability it's a cat: {probs[1].item():.6f}")

그 외 위 두개 코드는 업로드를 만들어 동물 사진을 업로드하면 고양이인지 판단을 해줍니다.
직접 이미지를 다운받으셔서 업로드하시면 저희가 만든 RESNET 모델이 판단하여 고양이인지 아닌지 판단해줍니다.

Comments