AI TECH
PyTorch Dataset & Dataloader
prefer_all
2022. 9. 27. 10:15
<목차>
1. Pytorch Dataset, Dataloader를 사용하는 방법
2. 데이터 입력 형태를 정의하는 Dataset 클래스
=> Image, Video, Text 등에 따른 Custom Data를 PyTorch에 사용할 수 있도록 학습
3. DataLoader를 통해 네트워크에 Batch 단위로 데이터를 로딩하는 방법
4. NotMNIST 데이터 직접 구현
Dataset에서 이미지 하나를 어떻게 처리할 지 정의했으면
DataLoader은 이걸 묶어서 feeding을 하는 역할임
Dataset 클래스
- 데이터 입력 형태를 정의하는 클래스
- 데이터를 입력하는 방식의 표준화
- Image, Text, Audio 등에 따른 다른 입력을 정의함
- torch의 Dataset을 상속받는 CustomDataset class는 init, len, getitem으로 구성됨
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): #index 값을 주었을 때 반환되는 데이터의 형태(X,y)
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 변화는 학습에 필요한 시점에 변환 (CPU에서 Tensor로 데이터 변환, GPU에서 학습 - 이를 병렬적으로 처리 가능) - 데이터 셋에 대한 표준화된 처리방법 제공 필요
- 최근에는 HuggingFace등 표준화된 라이브러리 사용
DataLoader 클래스
- Data의 Batch를 생성해주는 클래스
- 학습직전(GPU feed전) 데이터의 변환을 책임
- Tensor로 변환 + Batch 처리가 메인 업무
- 병렬적인 데이터 전처리 코드의 고민 필요
MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True)
# 배치데이터 가져오는 방법 1
next(iter(MyDataLoader)) # 얘를 가지고 GPU에 넣어줄 수 있음
# 방법 2
MyDataLoader = DataLoader(MyDataset, batch_size=3, shuffle=True)
for dataset in MyDataLoader: # 하나의 epic이 됨
print(dataset)
학습할 때는 batch size만큼 원래 데이터에서 나눠줘서 그 만큼의 for문이 돌아감
DataLoader 의 argument
[Pytorch] DataLoader parameter별 용도 - Subinium의 코딩일지
- dataset
index로 데이터를 참조하는 map-style dataset(getitem, len)과 iter로 참조하는 Iterable style dataset(iter)이 있다.
Iterable style dataset은 stream data, real-time log와 같이 random으로 읽기에 어렵거나, data에 따라 batch size가 달라지는 데이터(dynamic batch size)에 사용한다. - batch_size : int, optional, default=1
배치(batch)의 크기, dataset에서 return하는 데이터는 tensor이므로 만약 tensor로 변환이 안되는 데이터는 에러가 난다. - shffle : bool, optional, default=False
데이터를 DataLoader에서 섞어서 사용하겠는지를 설정 - sampler : Sampler, optional
데이터의 index를 원하는 방식대로 조정. map-style에서 컨트롤하기 위해 사용된다. - batch_sampler : Sampler, optional
위와 동일 - num_workers : int, optional, default=0
데이터 로딩에 사용하는 subprocess개수 (멀티프로세싱)
기본값이 0인데 이는 data가 main process로 불러오는 것을 의미한다. - collate_fn : callable, optional
map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능. zero-padding이나 Variable Size 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용한다.
- pin_memory : bool, optional
True 일 때 데이터로더는 Tensor를 CUDA 고정 메모리에 올린다. - drop_last : bool, optional
batch 단위로 데이터를 불러올 때 마지막에 남는 batch의 길이가 설정한 batch보다 작을 경우 사용. 특히 batch의 길이가 다른 경우에 따라 loss를 구하기 귀찮은 경우, batch의 크기에 따른 의존도 높은 함수를 사용할 경우 - time_out : numeric, optional, default=0
양수로 주어지는 경우, DataLoader가 data를 불러오는데 제한시간 - worker_init_fn : callable, optional, default=’None’
num_worker가 개수라면, 이 파라미터는 어떤 worker를 불러올 것인가를 리스트로 전달
Further Question
- DataLoader에서 사용할 수 있는 각 sampler들을 언제 사용하면 좋을지 같이 논의해보세요!
데이터의 index를 원하는 방식대로 조정. map-style에서 컨트롤하기 위해 사용된다.
2. 데이터의 크기가 너무 커서 메모리에 한번에 올릴 수가 없을 때 Dataset에서 어떻게 데이터를 불러오는게 좋을지 같이 논의해보세요!
batch size 조정, multi GPU 사용