데이터셋 추상화
PyTorch의 torch.utils.data.Dataset은 '인덱스로 예제 하나를 가져올 수 있는 대상'을 정의하는 표준 계약이야. 이 클래스를 상속하고 __len__과 __getitem__을 구현하면, 그 위에서 데이터 로더, 샘플러, 데이터 증강 같은 나머지 데이터 파이프라인이 그대로 작동해.
데이터셋은 예제별 변환을 처리하는 곳이야. 디스크에서 행을 읽고, 이미지를 디코딩하고, 문자열을 토큰화하고, 텐서를 정규화하지. 예제의 인덱스에 따라 달라지는 작업은 모두 여기에 둬. 반면 묶음에 따라 달라지는 작업, 이를테면 collation이나 최대 길이에 맞춘 padding은 DataLoader의 collate 함수에서 처리해.
팁: 데이터셋은 기본적으로 지연 방식으로 작동해.
__getitem__은 누군가 예제를 요청할 때만 실행돼. 그래서 테라바이트 규모의 데이터를 RAM에 전부 올리지 않고도 학습할 수 있어.Map-style과 iterable-style
Map-style은 가장 흔한 방식이야. Dataset을 상속하고 __getitem__(idx)를 구현해. 무작위 접근과 shuffling을 지원하고 길이도 알려져 있어. 유한하며 인덱스로 접근할 수 있는 데이터셋에 가장 적합해.
Iterable-style은 IterableDataset을 상속하고 __iter__를 구현해. 순차 스트리밍 방식이라 무작위 접근을 지원하지 않고, 길이를 알 수 없는 경우도 있어. 기록 스트림, 분산 샤딩, 거대한 web 규모 말뭉치에 가장 적합해.
눈 감고도 쓸 수 있어야 할 데이터셋 3개
- 텐서 래퍼 — 메모리에 올린 데이터에는
TensorDataset(X, y)를 써. 프로토타이핑에는 충분해. - 이미지 폴더 — 클래스별 하위 폴더로 구성된 이미지 데이터셋에는
torchvision.datasets.ImageFolder('path/')를 써. - 맞춤형 CSV / JSONL —
__init__에서 manifest를 읽고__getitem__에서 필요한 데이터를 지연 로딩해.
원칙: 데이터 버그는 대부분
__getitem__ 안에 숨어 있어. 학습을 시작하기 전에 예제 하나를 출력해 봐. 형태, dtype, 레이블이 모델이 기대하는 값과 맞는지 확인해야 해.