본문 바로가기
AI-Tech 부스트캠프/파이토치

[PyTorch] Dataset & Dataloaders

by Alan_Kim 2022. 12. 24.
728x90
반응형

모델에 데이터를 넣을려면 어떻게 해야할까?

자료를 모은다(collecting) → 자료를 정리한다(cleaning) → 전처리 작업 (pre processing) → 데이터(Data) 완성!

 

그럼 이것을 바로 모델에 넣으면 될까? NO! 

 

Dataset 클래스(class)를 통해  목적에 맞는 데이터 값을 받고 이것을 DataLoader라는 것을 통해 Model에 맞는 batch 등 Model input에 맞게 다듬은 다음에 Model에 넣는 것이다.

 

뭔 말이지...?

 

그래서 우선 하나씩 알아보자

 

Dataset 클래스

- 데이터 입력 형태를 정의하는 클래스

- 데이터를 입력하는 방식을 표준화 한다는 것에 의의가 있다.

- Image, Text, Audio 등에 따른 다른 입력 정의를 내린다.

- 클래스 안에 필수로 __init__ 함수, __len__ 함수, __getitem__ 함수가 있다.

 

예시 Code

import torch
from torch.utils.data import Dataset

class CustomDataset(Dataset):
    def __init__(self, text, labels): # 초기 데이터 생성방법을 지정
        self.data = text
        self.labels = labels
    
    def __len__(self):
        return len(self.labels) # 데이터의 전체 길이
    
    def __getitem__(self, idx):
        label = self.labels[idx]
        text = self.data[idx]
        sample = {"Text": text, "Class": label}
        return sample # index 값을 주었을 때 반환되는 데이터의 형태 (X,y)

 

Dataset 클래스 생성시 유의점

- 데이터 형태에 따라 각 함수를 다르게 정의한다.

- 모든 것을 데이터 생성 시점에 처리할 필요는 없음: image의 Tensor 변화는 학습에 필요한 시점에 변환하면 된다.

- 데이터 셋에 대한 표준화된 처리방법 제공 필요

- 최근에는 HuggingFace등 표준화된 라이브러리 사용

 

DataLoader 클래스

- Data의 Batch에 맞게 Data를 다듬어주는 클래스

- 학습직전(GPU에 feed 직전) 데이터의 변환을 책임진다.

- Tensor로 변환 + Batch 처리가 메인 업무

- 병렬적인 데이터 전처리 코드의 고민이 필요하다.

 

예시 Code

import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
class CustomDataset(Dataset):
    def __init__(self, text, labels): # 초기 데이터 생성방법을 지정
        self.data = text
        self.labels = labels
    
    def __len__(self):
        return len(self.labels) # 데이터의 전체 길이
    
    def __getitem__(self, idx):
        label = self.labels[idx]
        text = self.data[idx]
        sample = {"Text": text, "Class": label}
        return sample # index 값을 주었을 때 반환되는 데이터의 형태 (X,y)

text = ['Happy', 'Amazing', 'Sad','Unhappy' ,'Glum']
labels = ['Positive', 'Positive', 'Negative', 'Negative', 'Negative'] # text와 label은 1-1 corresponding이 되어야 한다.

MyDataset = CustomDataset(text,labels) # Dataset 생성

MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True) # Test set은 보통 shuffle을 하지 않으며 train, valid set은 선택사항이다.
next(iter(MyDataLoader)) # 다음에 input 될 Dataset 클래스 값
# {'Text': ['Glum', 'Sad'], 'Class': ['Negative', 'Negative']}

MyDataLoader = DataLoader(MyDataset, batch_size=2, shuffle=True) 
for dataset in MyDataLoader:
    print(dataset) # EPIC 2, 2, 1
# {'Text': ['Glum', 'Unhappy'], 'Class': ['Negative', 'Negative']}
# {'Text': ['Sad', 'Amazing'], 'Class': ['Negative', 'Positive']}
# {'Text': ['Happy'], 'Class': ['Positive']}

 

728x90
반응형

댓글