Datasets & DataLoader
기본 구조
모델에 데이터를 먹이는 방법
![](https://velog.velcdn.com/images/jsyeon/post/637bd9a5-3380-4b57-9713-fde52689607f/image.png)
ToTensor()는 데이터를 변형/전처리할 때(transform 단계)에서 수행하도록 하자! (Dataset의 init 단계에서 X)
Dataset을 하나하나 어떻게 처리할 지 정의했으면 DataLoader는 이것들을 묶어서 Model에 feeding 역할
Dataset Class
from torch.utils.data import datasets
- 데이터의 입력 형태를 정의하는 클래스
- 데이터를 입력하는 방식의 표준화
- Image, Text, Audio 등에 따른 다른 입력을 정의
필수
- __init__()
- __len__()
- __getitem__()
-> __getitem__() 은 data loader에서 호출하는 함수
생성시 유의점
- 데이터의 형태에 따라 각 함수를 다르게 정의해줘야 한다
- 모든 것을 데이터의 생성 시점에 처리할 필요가 없다
(image의 Tensor 벼놯는 학습에 필요한 시점에 변환!)
- dataset에 대한 표준화된 처리방법 제공 -> dataset을 사용하는 사람들을 위한 배려
- 최근에는 HugingFace와 같은 표준화된 라이브러리 사용
![](https://velog.velcdn.com/images/jsyeon/post/8b9bbfe2-d623-4b55-b031-2062ff09500a/image.png)
DataLoader Class
form torch.utils.data import DataLoader
- Data의 Batch를 생성해주는 class
- Dataset은 하나의 data를 어떻게 가져올 것인가? 라면
DataLoader는 그 인덱스를 가지고 여러개를 한번에 묶어서 모델에 던져주는 역할
- 학습직전 (GPU feed전) 데이터의 변환을 책임
- Tensor로 변환 + Batch처리
MyDataset = CUstomDataset(text, labels)
MyDataloader = DataLoader(MyDataset, batch_size=2, shuffle=True)
for dataset in MyDataloader:
print(dataset)
필수 parameter
- batch_size = 데이터를 몇 개씩 뽑을 것인가?
- sample = 데이터의 인덱스를 어떻게 뽑아줄지 정해주는 기법
- batch_sample = 배치의 인덱스
- collate_fn = 데이터가 올바르게 처리되지 않고 차원이 안맞은 채로 들어가는 경우가 있는데 이때 차원의 형태를 맞춰주는 역할을 함 (padding)
(보통 variable length(가변인자)를 처리할 떄 많이 사용함)
- drop_last = 마지막 batch를 삭제
ex) batch_size가 4인데 총 데이터의 길이가 10이면 DataLoader는 알아서 {4,4,2}를 가져오는데 이때 마지막의 batch_size의 개수가 다른 것을 알아서 삭제시켜줄지 안해줄지...
참고
모든 이미지는 부스트캠프 AI Tech교육 자료를 참고