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
반응형
'AI-Tech 부스트캠프 > 파이토치' 카테고리의 다른 글
[PyTorch] torch.transpose()와 numpy().transpose() 차이 (0) | 2023.01.01 |
---|---|
[PyTorch] 모델 불러오기 (0) | 2022.12.24 |
[PyTorch] torch.nn.Module에 대해서 (0) | 2022.12.24 |
[PyTorch] 파이토치 기본 구조에 대해서 알아보자 (0) | 2022.12.23 |
[PyTorch] 파이토치에 대해서 알아보자 (0) | 2022.12.23 |
댓글