data sample을 처리하는 코드는 지저분한고 관리가 어려울 수 있다. 우리는 이상적으로 dataset code가 가독성과 편리성을 위해 학습코드와 분리되기를 원한다. pytorch는 두가지 data promivitives를 제공한다. torch.utils.data.DataLoader와 torch.utils.data.Datasets이다. Datasets은 sample과 대응하는 label을 저장하고, DataLoader는 sample들에 쉽게 접근할 수 있게 하기 위해 dataset에 iterable을 wrap한다.
pytorch domain libraries는 이미 load된 데이터셋을 제공하고, 이 dataset들은 torch.utils.data.Dataset을 subclass한다. 그리고 특정 데이터에 구체적인 함수도 구현한다. 이러한 데이터들은 prototype을 만들거나 모델을 benchmark하는데에 사용할 수 있다. Image Dataset, Text Datasets, Audio Datasets들이 준비되어 있다.
import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor()
)
이렇게 dataset을 불러왔을 때 아래와 같은 코드로 dataset sample에 접근할 수 있다.
img, label = training_data[sample_idx]
Custom Dataset은 세가지 함수를 반드시 구현해야한다.
이 함수는 Dataset object를 instance화할 때 한번 실행된다. 이미지가 있는 폴더, annotation file transform을 초기화한다.
이 함수는 데이터셋의 sample들의 개수를 반환한다.
이 함수는 dataset으로부터 주어진 index에 맞는 sample을 load하고 반환한다.
Dataset은 dataset의 feature와 label을 한번에 가져온다. 우리는 model을 training할 때 sample을 minibatch에 넣어서 전달, 매 epoch마다 reshuffle, Python multiprocessing을 이용한 data 검색속도 향상등의 기능을 원한다.
Dataloader는 이러한 복잡한 기능들을 쉬운 API로 추상화한 iterable이다.
from torch.utils.data import DataLoader
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
우리는 dataset을 DataLoader에 loader하고 필요한 만큼 반복할 수 있다. 아래의 each iteration마다 train_features와 train_labels를 각각 batch size만큼 포함한 batch를 반환한다. shuffle=True로 지정하였을 때 data의 모든 batch를 반복하였을 때 데이터는 다시 섞인다.
# Display image and label.
train_features, train_labels = next(iter(train_dataloader))