개발자식

[Pytorch] Pytorch Datasets, Dataloaders 본문

AI/Pytorch

[Pytorch] Pytorch Datasets, Dataloaders

밍츠 2022. 10. 2. 04:33

어떻게 하면 대용량의 데이터를 처리하고 학습시킬지에 대해 중요해졌다. -> custom dataset/dataloader가 필요하다.

그리고 모델을 학습하는 것만큼 학습시킬 데이터를 준비하는 것도 복잡하다.

모델에 데이터를 먹이는 방법에 대해 공부해보자

 

수집된 데이터를 Dataset, DataLoader를 거쳐 모델에 먹이는 과정이다.

 

먼저 Dataset이란?

- 데이터 입력 형태를 정의하는 클래스이다.

- 데이터 입력 방식의 표준화이다.

- Image, Text, Audio 등에 따른 다른 입력을 정의한다.

 

Dataset의 구성

- 이 구조만 알아도 기본은 작성할 수 있다.

  • __init__(self): 여기서 필요한 변수들을 선언한다. 전체 x_data와 y_data load 하거나 파일목록을 load 하자.
  • __len__(self): 데이터 전체 길이를 반환한다. 데이터의 인덱스가 범위 내에 있는지 확인할 수 있다.
  • __get_item__(self, index): index번째 data를 return 하도록 코드를 짜야한다. return 하는 type은 문제마다 다르다. (분류 문제에서는 주로 dict)

CustomDataset 코드

- 기본적으로 Dataset 클래스를 상속해서 만든다.

import torch
from torch.utils.data import Dataset, DataLoader

class CustomDataset(Dataset):
    def __init__(self, text, labels):
            self.labels = labels
            self.data = text

    def __len__(self):
            return len(self.labels)

    def __getitem__(self, idx):
            label = self.labels[idx]
            text = self.data[idx]
            sample = {"Text": text, "Class": label}
            return sample
text = ['Happy', 'Amazing', 'Sad', 'Unhapy', 'Glum']
labels = ['Positive', 'Positive', 'Negative', 'Negative', 'Negative']
MyDataset = CustomDataset(text, labels)

Dataset 클래스 생성 시 유의할 점

- 데이터 형태에 따라 각 함수를 다르게 정의한다.

- 모든 것을 데이터 생성 시점에 처리할 필요는 없다. (init에서 모든 것을 다 처리해줘야 하는 것은 아님)

-> image의 tensor 변화는 학습에 필요한 시점에 변환

- 최근에는 HuggingFace 등 표준화된 라이브러리를 사용한다.

 

이전에는 데이터 전체를 한 번에 돌리는 코드만 봤다면 DataLoader 클래스를 활용해서 Data의 배치를 생성해줄 수 있다.

 

DataLoader 클래스

- Data의 Batch를 생성해주는 클래스

- 학습 직전 데이터의 변환을 책임진다.

- Tensor로 변환 + Batch 처리가 메인 업무

- 병렬적인 데이터 전처리 코드의 고민이 필요하다.

 

위의 코드랑 이어서 DataLoader를 작성해보자.

MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True)
next(iter(MyDataLoader))
Output:
{'Text': ['Glum', 'Unhapy'], 'Class': ['Negative', 'Negative']}
MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True)
for dataset in MyDataLoader:
    print(dataset)
Output:
{'Text': ['Glum', 'Amazing'], 'Class': ['Negative', 'Positive']}
{'Text': ['Sad', 'Happy'], 'Class': ['Negative', 'Positive']}
{'Text': ['Unhapy'], 'Class': ['Negative']}

DataLoader에서 중요하게 볼 점은 하이퍼파라미터이다.

 

DataLoader 하이퍼파라미터

DataLoader(
    dataset, # Dataset 인스턴스
    batch_size = 1 # 배치 사이즈
    shuffle = False # 데이터 섞음 유무
    sampler = None #데이터를 어떻게 뽑을지(다양한 방법 존재)
    batch_sampler = None # index를 컨트롤 하는 도구
    num_workers = 0 # 데이터 불러올때 사용하는 프로세스 개수
    collate_fn = None # 데이터 셋 크기가 일정하지 않을 때 배치 단위로 적용할 함수 입력
    pin_memory = False
    drop_last = False # 마지막 배치 사용 여부
    timeout = 0 # 데이터를 불러오는데 제한 시간
    worker_init_fn = None,
	prefetch_factor = 2,
    persistent_workers = False
)

 

Dataset 관련 모듈

  1. torch.utils.data: 데이터셋의 표준을 정의하고 데이터셋을 불러오고 자르고 섞는데 쓰는 도구들이 들어있는 모듈이다. 파이토치 모델을 학습시키기 위한 데이터셋의 표준을 torch.utils.data.Dataset에 정의한다. Dataset 모듈을 상속하는 파생 클래스는 학습에 필요한 데이터를 로딩해주는 torch.utils.data.DataLoader 인스턴스의 입력으로 사용할 있다.
  2. torchvision.dataset: torch.utils.data.Dataset을 상속하는 이미지 데이터셋의 모음이다. MNIST나 CIFAR-10과 같은 데이터셋을 제공해준다.
  3. torchtext.dataset: torch.utils.data.Dataset을 상속하는 텍스트 데이터셋의 모음이다. 기본적으로 IMDb나 AG_NEWS와 같은 데이터셋을 제공해준다.
  4. torchvision.transforms: 이미지 데이터셋에 쓸 수 있는 여러 가지 변환 필터를 담고 있는 모듈이다. 예를 들어 Tensor로 변환한다던지, 크기 조절(Resize)과 잘라내기(Crop)으로 이미지를 수정할 수 있고 밝기(Brightness)와 같은 값을 조절하는데 사용될 수 있다.
  5. torchvision.utils: 이미지 데이터를 저장하고 시각화하기 위한 도구가 들어있는 모듈이다.

-> pytorch 공식 문서를 활용해서 함수를 찾고 source를 보는 것을 추천한다.

 

기본 과제 2에서 주로 위 내용을 다루기 때문에 과제를 복습하면서 추가로 내용을 작성할 예정이다.

Comments