Dataset Class
데이터 입력 형태를 정의하는 클래스
- 데이터를 입력하는 방식의 표준화
- Image, Text, Audio 등에 따라 다른 입력 정의
import torch
from torch.utils.data import Dataset
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
Dataset 클래스 생성시 유의점
- 데이터 형태에 따라 각 함수를 다르게 정의
- 모든 것을 데이터 생성 시점에 처리할 필요는 없음
- image의 Tensor 변화는 학습에 필요한 시점에 변환
- 데이터 셋에 대한 표준화된 처리방법 제공 필요
- 최근에는 HuggingFace 등 표준화된 라이브러리 사용
관련 모듈
- torch.utils.data: 데이터셋의 표준을 정의하고 데이터셋을 불러오고 자르고 섞는데 쓰는 도구들이 있는 모듈
- torchvision.dataset: torch.utils.data.Dataset을 상속하는 이미지 데이터셋의 모듈
- torchtext.dataset: torch.utils.data.Dataset을 상속하는 텍스트 데이터셋의 모듈
- torchvision.transforms: 이미지 데이터셋에 쓸 수 있는 여러 가지 변환 필터를 담고 있는 모듈
- torchvision.utils: 이미지 데이터를 저장하고 시각화하기 위한 도구들이 있는 모듈
DataLoader Class
Data의 Batch를 생성해주는 클래스
- 학습직전(GPU feed전) 데이터의 변환을 책임
- Tensor로 변환 + Batch 처리가 메인 업무
- 병렬적인 데이터 전처리 코드의 고민 필요
from torch.utils.data import DataLoader
customDataLoader = DataLoader(customDataset, batch_size=2, shuffle=True)
DataLoader Parameters
- sampler: 블군형 데이터셋의 경우 주로 사용하며 데이터를 어떻게 뽑을 지 index를 컨트롤하는 방법
- index를 컨트롤하기 때문에 사용 시 shuffle=False
- collate_fn: Variable 인자에 가변성이 있을 때 등 데이터 사이즈를 맞추기 위해 재정의
- num_workers: 데이터를 불러올때 사용하는 서브 프로세스(process() 개수
- 너무 높이면 데이터를 불러 CPU와 GPU 사이에서 많은 교류가 일어나 오히려 병목이 생길 수 있다
- pin_memory: Tensor를 CUDA 고정 메모리에 할당
- drop_last: batch_size에 따른 마지막 배치의 사용 유무
- time_out: 양수로 주어지는 경우, DataLoader가 data를 불러오는데 제한시간
- worker_init_fn: 어떤 worker를 불러올 것인지 리스트로 전달