Dataset abstraction
PyTorch torch.utils.data.Dataset 은 'index 해서 한 example 가져올 수 있는 것' 의 canonical contract. Subclass 하고 __len__ 과 __getitem__ 구현하면, 나머지 data pipeline (loader, sampler, augmentation) 이 위에서 그냥 작동.
Dataset 은 example 당 transformation 이 사는 곳: disk 에서 row 읽기, image decode, string tokenize, tensor normalize. Example index 에 의존하는 모든 게 여기. Batch 에 의존하는 (collation, max length 까지 padding) 건 DataLoader 의 collate function.
__getitem__ 은 누가 example 요청할 때만 돌아. Terabyte-scale data 를 RAM 에 다 안 올리고 train 할 수 있는 이유야.Map-style vs iterable-style
Map-style (가장 흔함): Dataset subclass, __getitem__(idx) 구현. Random access, shuffling 지원, length 알려짐. Finite, indexable dataset 에 best.
Iterable-style: IterableDataset subclass, __iter__ 구현. Sequential streaming, random access 없음, length unknown 가능. Log stream, distributed sharding, 거대 web-scale corpus 에 best.
눈 가리고도 쓸 수 있어야 할 Dataset 3 개
- Tensor wrapper — in-memory data 에
TensorDataset(X, y). Prototyping 에 OK. - Image folder — class-per-subfolder image dataset 에
torchvision.datasets.ImageFolder('path/'). - Custom CSV / JSONL —
__init__에 manifest 읽고__getitem__에 lazy-load.
__getitem__ 안에 숨어. Training 시작 전에 example 하나 print. Shape, dtype, label 이 본인 model 기대와 맞는지 확인.