1 분 소요

PyTorch의 데이터 파이프라인은 DatasetDataLoader라는 두 가지 추상화를 중심으로 구성된다. Dataset은 데이터가 무엇인지를 정의하고, DataLoader는 데이터를 모델에 공급하는 방법을 정의한다. 두 역할을 분리하면 학습 루프를 변경하지 않고도 데이터셋을 쉽게 교체할 수 있다.

3.1 Dataset

Dataset은 학습 데이터와 각 데이터에 접근하는 방법을 정의하는 PyTorch 기본 클래스다.

from torch.utils.data import Dataset

class MyDataset(Dataset):
    def __init__(self, data, labels, transform=None):
        self.data = data
        self.labels = labels
        self.transform = transform

    def __len__(self):             # 필수: 샘플 갯수
        return len(self.data)

    def __getitem__(self, idx):    # 필수: 인덱스별 하나의 샘플 얻기
        x = self.data[idx]
        if self.transform:
            x = self.transform(x)
        return x, self.labels[idx]

중요: 모든 사용자 정의 Dataset__len____getitem__을 구현해야 한다. DataLoader가 내부적으로 이 메서드들을 호출한다. 둘 중 하나라도 빠지면 TypeError가 발생한다.

3.2 DataLoader

DataLoader는 데이터셋을 배치 단위로 불러와 모델 학습에 공급하는 PyTorch 도구다.

from torch.utils.data import DataLoader

loader = DataLoader(
    dataset,
    batch_size=32,
    shuffle=True,        # 각 에포크마다 데이터 순서를 무작위로 섞음
    num_workers=4,       # 병렬 로딩 서브프로세스 카운트
    pin_memory=True,     # 더 빠른 CPU→GPU 전송
    drop_last=False,     # `True`이면 샘플 수가 부족한 마지막 배치를 버림
)

for X, y in loader:
    X, y = X.to(device), y.to(device)
    # ... 학습(훈련) 스텝
인수 목적
batch_size 배치마다 포함할 샘플 수를 지정한다.
shuffle=True 에포크마다 샘플 순서를 무작위로 섞는다. 검증·시험 데이터는 섞지 않는다.
num_workers 병렬 로딩에 사용할 하위 프로세스 수를 지정한다. 0이면 주 프로세스만 사용한다.
pin_memory=True 텐서를 페이지 고정 CPU 메모리에 배치해 CUDA 전송 속도를 높인다.
collate_fn 샘플 목록을 하나의 배치로 병합하는 사용자 정의 함수를 지정한다.
sampler 샘플을 추출하는 전략을 정의한다. 예를 들어 클래스 불균형에는WeightedRandomSampler를 사용할 수 있다.
drop_last=True 마지막 배치의 크기가batch_size보다 작으면 해당 배치를 버린다.

3.3 torchvision 변환

torchvision은 PyTorch에서 이미지 데이터 처리, 변환, 사전 학습 모델을 제공하는 컴퓨터 비전 라이브러리다.

import torchvision.transforms as T
from torchvision.transforms import v2  # 새 transforms API (PyTorch 2.x)

train_transform = T.Compose([
    T.Resize((224, 224)),
    T.RandomHorizontalFlip(p=0.5),
    T.RandomRotation(degrees=15),
    T.ColorJitter(brightness=0.2, contrast=0.2),
    T.ToTensor(),                     # PIL/ndarray [H,W,C] uint8 -> Tensor [C,H,W] float [0,1]
    T.Normalize(mean=[0.485, 0.456, 0.406],  # ImageNet stats
                std=[0.229, 0.224, 0.225]),
])

val_transform = T.Compose([
    T.Resize((224, 224)),
    T.ToTensor(),
    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

중요: ToTensor()는 두 가지 작업을 수행한다. 배열의 차원 순서를 [H,W,C]에서 [C,H,W]로 변환하고, uint8 범위 [0,255]float32 범위 [0.0,1.0]으로 조정한다. Normalize()ToTensor() 다음에 적용하며 채널별 평균과 표준편차를 사용한다.

댓글남기기