C.W.K.
Stream
Lesson 03 of 07 · published

Real Data 위 Custom Dataset

~14 min · dataset, imagefolder, csv

Level 0Tensor 호기심
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

two-method 계약

'indexable list of sample' 로 줄일 수 있는 어떤 data shape 든, custom Dataset 은 그저 필요:

  • __len__(self) — 총 sample
  • __getitem__(self, idx) — index idx 의 sample 반환

그게 전체 계약. DataLoader 가 나머지.

오백 번 짜게 될 pattern

  1. ImageFolder-style — subfolder 이름이 class label 인 directory tree. torchvision 이 canonical case 위 ImageFolder ship; 'data 가 비슷한데 살짝 다름' 위 variant 짤 거.
  2. CSV / pandas — path 와 label 의 manifest 파일 로드, 요청 시 disk 에서 fetch.
  3. HDF5 / Parquet / WebDataset — 큰 dataset 위, disk-backed 형식에서 read.
  4. In-memory tensor — fit 하는 작은 data 위, 그냥 attribute 로 tensor 들기.

Lazy vs eager loading

큰 dataset 은 lazy 로드 필수 — __getitem__ 안 disk 에서 read, __init__ 아님. 작은 dataset 은 eager 로드 가능, __init__ 에 pre-process. 경계는 대략 'RAM 에 여유로 fit' vs 'X' — 머신 따라 보통 10-100 GB.

Code

ImageFolder-style — class-named directory tree 에서 로드·python
import os
import torch
from torch.utils.data import Dataset
from PIL import Image

class ImageDirDataset(Dataset):
    """root/
        class_a/img1.jpg
                img2.jpg
        class_b/img3.jpg
    """
    def __init__(self, root, transform=None):
        self.root = root
        self.transform = transform
        self.samples = []
        self.classes = sorted(d for d in os.listdir(root)
                              if os.path.isdir(os.path.join(root, d)))
        self.class_to_idx = {c: i for i, c in enumerate(self.classes)}

        for cls in self.classes:
            cls_dir = os.path.join(root, cls)
            for fname in os.listdir(cls_dir):
                if fname.lower().endswith(('.jpg', '.jpeg', '.png')):
                    self.samples.append((os.path.join(cls_dir, fname), self.class_to_idx[cls]))

    def __len__(self):
        return len(self.samples)

    def __getitem__(self, idx):
        path, label = self.samples[idx]
        img = Image.open(path).convert('RGB')
        if self.transform:
            img = self.transform(img)
        return img, label
CSV-based dataset — path + label manifest·python
import torch
import pandas as pd
from torch.utils.data import Dataset
from PIL import Image

class CSVImageDataset(Dataset):
    def __init__(self, csv_path, image_root, transform=None):
        self.df = pd.read_csv(csv_path)              # columns: 'path', 'label'
        self.image_root = image_root
        self.transform = transform

    def __len__(self):
        return len(self.df)

    def __getitem__(self, idx):
        row = self.df.iloc[idx]
        img = Image.open(f"{self.image_root}/{row['path']}").convert('RGB')
        if self.transform:
            img = self.transform(img)
        return img, int(row['label'])
Tabular Dataset — feature 의 pandas DataFrame·python
import torch
import pandas as pd
from torch.utils.data import Dataset

class TabularDataset(Dataset):
    def __init__(self, csv_path, target_col, feature_cols=None):
        df = pd.read_csv(csv_path)
        self.target = torch.tensor(df[target_col].values, dtype=torch.long)
        cols = feature_cols or [c for c in df.columns if c != target_col]
        self.features = torch.tensor(df[cols].values, dtype=torch.float32)

    def __len__(self):
        return len(self.target)

    def __getitem__(self, idx):
        return self.features[idx], self.target[idx]

External links

Exercise

어떤 작은 image set 이든 위 ImageDirDataset 짜기 (또는 6 directory 에 5 random JPEG 씩 만들기). len(dataset) 확인, dataset[0] sample 해서 image open 되고 label 이 directory name 일치 검증. num_workers=0 vs num_workers=4 로 전체 dataset iterate 시간 — speedup 측정.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.