[실습] 제3장 데이터처리
PyTorch의 데이터 파이프라인은 Dataset과 DataLoader라는 두 가지 추상화를 중심으로 구성된다. 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()다음에 적용하며 채널별 평균과 표준편차를 사용한다.
댓글남기기