데이터 스터디/DL

[Pytorch] 파이토치 Dataset, Dataloader

케이와이엠 2023. 11. 17. 13:17
torch에는 데이터를 처리하기 위해 torch.utils.data.DataLoder와 torch.utils.data.Dataset의 두가지 요소를 제공
dataset : 미리 준비된 데이터셋을 불러 올 수 있으며, 가지고 있는 데이터와 라벨을 저장
dataloader : dataset을 데이터에 쉽게 접근할 수 있도록 batch를 설정해 iterable(반복가능객체)로 만듦.

 

Dataset 관련 모듈

  • torch.utils.data: 데이터셋의 표준을 정의하고 데이터셋을 불러오고 자르고 섞는데 쓰는 도구들이 들어있는 모듈입니다. 
  • torchvision.dataset
  • torchtext.dataset
  • torchvision.transforms
  • torchvision.tils

Dataset의 기본 구성 요소

from torch.utils.data import Dataset
class CustomDataset(Dataset):
    def __init__(self,):
        pass

    def __len__(self):
        pass

    def __getitem__(self, idx):
        pass
  • __init__ 메서드
    • 데이터의 위치나 파일명과 같은 초기화 작업을 위해 동작
    • 이미지를 처리할 transforms들을 Compose해서 정의
    • self.X , self.y , self.feature_names, self.target_names 지정
  • __len__ 메서드
    • Dataset의 최대 요소 수를 반환하는데 사용
    • len_dataset = len(data) 로 지정
  • __getitem__ 메서드
    • idx번째 데이터를 반환하는데 사용
    • 원본 데이터를 가져와서 전처리하고 데이터 증강하는 부분
    • X, y 불러와서 텐서처리

 

DataLoader의 기본 구성 요소

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None)
  • dataset
  • batch_size
    : batch size는 하나의 소그룹에 속하는 데이터 수를 의미
  • shuffle : 데이터를 섞어서 사용하겠는지
  • sampler / batch_sampler
  • num_workers
  • collate_fn
    : zero-padding이나 Variable Size 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용
#PyTorch의 `collate_fn`을 활용하여 다양한 길이의 데이터를 동일한 길이로 패딩하는 방법을 배워봅시다.
#하나의 batch에서 가장 길이가 긴 sample 기준으로 길이를 맞춥니다.
#길이를 맞출 때는 비어있는 오른쪽을 0으로 패딩합니다. 예) 1 1 1 -> 1 1 1 0 0 0
dataloader_example = torch.utils.data.DataLoader(dataset_example,
                                                 batch_size=2,
                                                 collate_fn=my_collate_fn)
for d in dataloader_example:
    print(d['X'], d['y'])
  • pin_memory
    : DataLoader에서 이걸 True로 바꾸면 Tensor를 CUDA 고정 메모리에 할당
  • drop_last
    batch_size를 >=1로 설정하면 마지막 batch의 길이가 달라질 수 있음
    따라서  batch의 크기에 따른 의존도 높은 함수를 사용할 때 걱정이 되는 경우 마지막 batch를 사용하지 않을 수 있음