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(getitemlen)과 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 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용한다.

variable length에 가변인자를 할때 collate_fn을 사용함

 

  • 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

  1. DataLoader에서 사용할 수 있는 각 sampler들을 언제 사용하면 좋을지 같이 논의해보세요!
데이터의 index를 원하는 방식대로 조정. map-style에서 컨트롤하기 위해 사용된다.

2. 데이터의 크기가 너무 커서 메모리에 한번에 올릴 수가 없을 때 Dataset에서 어떻게 데이터를 불러오는게 좋을지 같이 논의해보세요!

batch size 조정, multi GPU 사용