PyTorch의 데이터 로딩 및 변환 (Dataset과 DataLoader)
딥러닝 모델을 학습할 때 데이터의 효율적인 로딩과 변환은 매우 중요한 요소입니다. PyTorch는 이를 위해 torch.utils.data
모듈을 제공하며, Dataset
과 DataLoader
를 활용하면 데이터를 손쉽게 다룰 수 있습니다. 이번 포스팅에서는 PyTorch에서 데이터를 로딩하고 변환하는 방법을 자세히 살펴보겠습니다.
1. PyTorch 데이터 로딩 개요
PyTorch에서는 데이터셋을 다룰 때 크게 두 가지 주요 클래스를 사용합니다.
Dataset
: 데이터를 불러오는 기본 단위로, 사용자 정의 데이터셋을 만들 때 상속하여 사용합니다.DataLoader
:Dataset
을 효율적으로 불러오고 배치 단위로 데이터를 나누어 학습할 수 있도록 도와주는 클래스입니다.
이 두 클래스를 활용하면 대용량 데이터셋을 효율적으로 다룰 수 있으며, 배치 단위로 모델에 데이터를 공급할 수 있습니다.
2. Dataset 클래스 사용법
Dataset
클래스는 PyTorch에서 데이터를 다룰 때 가장 기본이 되는 클래스입니다. PyTorch의 torchvision.datasets
모듈에서는 MNIST, CIFAR-10과 같은 유명한 데이터셋을 바로 사용할 수 있도록 제공하지만, 일반적인 경우 사용자가 직접 Dataset
클래스를 상속하여 커스텀 데이터셋을 정의해야 합니다.
2.1 기본적인 Dataset 구현
아래는 Dataset
클래스를 상속하여 사용자 정의 데이터셋을 만드는 예제입니다.
import torch
from torch.utils.data import Dataset
import pandas as pd
import numpy as np
class CustomDataset(Dataset):
def __init__(self, csv_file):
self.data = pd.read_csv(csv_file)
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = torch.tensor(self.data.iloc[idx, :-1].values, dtype=torch.float32)
label = torch.tensor(self.data.iloc[idx, -1], dtype=torch.long)
return sample, label
위 코드에서 __init__
메서드는 CSV 파일을 로드하여 데이터를 저장하고, __len__
메서드는 데이터셋의 크기를 반환합니다. __getitem__
메서드는 특정 인덱스에 해당하는 데이터를 가져옵니다.
3. DataLoader 클래스 사용법
DataLoader
는 Dataset
을 보다 효율적으로 다룰 수 있도록 도와줍니다. 특히, 다음과 같은 기능을 제공합니다.
- 배치(batch) 단위로 데이터를 로드
- 데이터를 섞어서(shuffle) 제공
- 병렬 데이터 로딩 (multiprocessing)
3.1 DataLoader 사용 예제
아래는 DataLoader
를 활용하여 데이터셋을 불러오는 예제입니다.
from torch.utils.data import DataLoader
# 데이터셋 생성
csv_file = "data.csv"
dataset = CustomDataset(csv_file)
# DataLoader 생성
dataloader = DataLoader(dataset, batch_size=32, shuffle=True, num_workers=4)
# DataLoader 순회
for batch_idx, (data, labels) in enumerate(dataloader):
print(f"Batch {batch_idx}: Data shape {data.shape}, Labels shape {labels.shape}")
여기서 batch_size=32
는 한 번에 32개의 데이터를 가져오도록 설정하며, shuffle=True
는 데이터를 섞어서 로드하도록 설정합니다. num_workers=4
는 데이터 로딩을 병렬로 수행하여 속도를 높입니다.
4. 데이터 변환 (Transformations)
PyTorch에서는 데이터 전처리와 변환을 쉽게 할 수 있도록 torchvision.transforms
모듈을 제공합니다. 특히 이미지 데이터를 다룰 때 유용합니다.
4.1 이미지 데이터 변환 예제
아래는 transforms
를 활용하여 이미지 데이터를 변환하는 예제입니다.
from torchvision import transforms
from PIL import Image
# 이미지 변환 파이프라인 정의
transform = transforms.Compose([
transforms.Resize((128, 128)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.5], std=[0.5])
])
# 이미지 로딩 및 변환
image = Image.open("image.jpg")
image = transform(image)
print(image.shape) # torch.Size([3, 128, 128])
위 코드에서는 Resize()
를 통해 이미지 크기를 조정하고, ToTensor()
를 통해 PyTorch 텐서로 변환한 후, Normalize()
를 적용하여 정규화를 수행합니다.
5. 사용자 정의 Transform 적용
데이터셋을 사용할 때 특정한 전처리를 적용해야 하는 경우, 사용자 정의 Transform
클래스를 만들 수 있습니다.
5.1 사용자 정의 Transform 구현
class CustomTransform:
def __call__(self, sample):
data, label = sample
data = data / 255.0 # 정규화
return data, label
# Dataset에 Transform 적용
dataset = CustomDataset("data.csv")
dataset = [(CustomTransform()(sample)) for sample in dataset]
위와 같이 사용자 정의 변환 클래스를 만들고, __call__
메서드를 오버라이딩하면 간단하게 데이터를 변환할 수 있습니다.
6. Dataset과 DataLoader 활용 예제 (MNIST)
마지막으로, 실제로 Dataset
과 DataLoader
를 활용하여 MNIST 데이터를 로드하는 전체적인 예제를 살펴보겠습니다.
import torch
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# 데이터 변환 정의
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
# MNIST 데이터셋 로드
train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)
# DataLoader 생성
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
# 데이터 확인
for batch_idx, (data, target) in enumerate(train_loader):
print(f"Batch {batch_idx}: Data shape {data.shape}, Target shape {target.shape}")
break # 첫 번째 배치만 확인
위 예제에서는 torchvision.datasets.MNIST
를 활용하여 데이터를 로드하고, DataLoader
를 통해 배치 단위로 데이터를 처리합니다.
7. 마무리
이번 포스팅에서는 PyTorch에서 Dataset
과 DataLoader
를 활용하여 데이터를 로딩하고 변환하는 방법을 살펴보았습니다. Dataset
을 상속하여 사용자 정의 데이터셋을 만들고, DataLoader
를 사용하여 배치 단위로 데이터를 로딩하는 과정이 중요합니다. 또한, transforms
를 활용하여 이미지 데이터를 변환하고, 사용자 정의 Transform을 적용하는 방법도 배웠습니다.
PyTorch를 활용한 딥러닝 모델 개발에서 데이터 전처리는 필수적인 과정이므로, 본 내용을 바탕으로 다양한 데이터셋을 다루는 연습을 해보시기 바랍니다.
'Python DeepLearning' 카테고리의 다른 글
PyTorch Lightning을 이용한 모델 트레이닝 효율화 (0) | 2025.04.12 |
---|---|
TensorFlow 및 Keras의 콜백 함수 활용법 (0) | 2025.04.11 |
TensorFlow의 데이터 입력 파이프라인 (tf.data) (0) | 2025.04.09 |
딥러닝 프레임워크에서 GPU 가속 사용법 (0) | 2025.04.08 |
모델 저장 및 로드 방법 (TensorFlow & PyTorch) (0) | 2025.04.07 |