Home [BoostCamp AI Tech / PyTorch] Day7 - Datasets & Dataloaders
Post
Cancel

[BoostCamp AI Tech / PyTorch] Day7 - Datasets & Dataloaders

PyTorch : Datasets & Dataloaders


PyTorch Data 구조

1. Data

  • 데이터는 데이터 그 자체를 의미한다.
  • 정제되거나 전처리, 누적이 이미 다 되어 들어오는 경우도 많지만 아닌 경우도 있다.
  • 보통 데이터 엔지니어 통해서 데이터가 정리가 되어 오는 경우가 많다.

2. Dataset

  • Dataset class는 이미 구현되어 있는 것을 상속에서 세팅하는 경우가 많다.
  • __init__(), __len()__, __getitem()__과 같이 필수적으로 생성해줘야하는 것들이 존재한다.
    • __init__() : 데이터를 로드하는 방법을 세팅하는 부분이다. 일반적으로 X, y를 지정하거나 다른 메서드들에 사용하는 attribute들을 세팅해주는 경우가 많다.
    • __len()__ : 흔히 어떤 데이터셋을 len(dataset)으로 처리했을 때 어떤 값을 반환할 지를 구현하는 부분이다.
    • __getitem()__ : 파라미터에 self와 함께 idx가 들어오는 경우가 일반적이다. 이 매직메서드는 우리가 일반적으로 []으로 데이터에 접근할 때 어떻게 반환하는 가를 구현하는 부분이다. map-style이라고도 한다.

transforms

  • transforms는 전처리하는 부분을 다루고 있다.
  • dataloader에 transform 파라미터가 존재하는데 이 부분에 들어갈 것들을 처리한다.
  • ToTensor(), CenterCrop() 같은 것들이 들어간다.
  • 보통 실제 구현하는 경우는 잘 없다…

DataLoader

  • 우리가 구현한 모델에 data feeding을 하는 부분이다.
  • batch단위로 분리해주고 data shuffle, sampling 등을 진행해서 model에 데이터를 제공한다.

Dataset Class

  • 앞서 간단히 말했지만 데이터의 입력 형태를 결정하는 클래스이다.
  • 데이터의 종류에 따라 입력을 다르게 정의해야한다.
    • 이미지, 텍스트, 오디오등 데이터의 형식이 가장 중요한 포인트이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import torch
from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, labels):
        self.X = data
        self.y = labels
    
    def __len__(self):
        return len(self.y)
    
    def __getitem__(self, idx):
        label = self.y[idx]
        data = self.X[idx]

        return data, label
  • 이때 __getitem__의 형식도 자유자재로 데이터에 맞춰 결정해주면 좋다.
    • classification 문제는 dict type으로 반환하는 경우가 많다.
  • 모든 것을 데이터 생성시점에 처리할 필요는 없다. 데이터를 한번에 불러오면 그 자체가 무거워질 수 있기 때문이다.
    • image data의 경우 Tensor변화는 학습에 필요한 시점에 변환한다.
  • 팀원들과의 협업에서 데이터 셋의 표준 처리방법을 제공 및 공유하는 것이 좋다.

DataLoade class

1
2
3
4
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, multiprocessing_context=None, generator=None, *, 
            prefetch_factor=2, persistent_workers=False)
  • DataLoader는 여러 데이터를 묶어서 model에 feed하는 역할을 한다.
  • Data의 batch를 생성하는 역할을 한다.
  • 학습직전 (GPU feed전) 데이터의 변환을 책임진다.
  • 주로 tensor변환, batch 처리가 메인 업무이다.
  • 주목할 파라미터
    • sampler : data 추출기법을 설정하는 부분이다.
    • collate_fn : variable length(가변길이)의 데이터를 batch 단위로 처리할 때 남은 데이터에 대해 padding을 설정해준다.
      보통 sequence data에 많이 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
data = ['apple', 'dog', 'cat', 'banana', 'tomato']
labels = [1, 0, 0, 1, 1]
MyData = MyDataset(data, labels)

MyDataLoader = DataLoader(MyData, batch_size=2, shuffle=True)
next(iter(MyDataLoader))
# [('apple', 'tomato'), tensor([1, 1])]

MyDataLoader = DataLoader(MyData, batch_size=2, shuffle=True)
for dataset in MyDataLoader:
    print(dataset)
'''
[('dog', 'apple'), tensor([0, 1])]
[('cat', 'banana'), tensor([0, 1])]
[('tomato',), tensor([1])]
'''
This post is licensed under CC BY 4.0 by the author.

[BoostCamp AI Tech / PyTorch] Day7 - AutoGrad & Optimizer

[BoostCamp AI Tech] Day7

Comments powered by Disqus.