Python DeepLearning

PyTorch의 데이터 로딩 및 변환 (Dataset과 DataLoader)

PyExplorer 2025. 4. 10. 13:52
728x90

PyTorch의 데이터 로딩 및 변환 (Dataset과 DataLoader)

딥러닝 모델을 학습할 때 데이터의 효율적인 로딩과 변환은 매우 중요한 요소입니다. PyTorch는 이를 위해 torch.utils.data 모듈을 제공하며, DatasetDataLoader를 활용하면 데이터를 손쉽게 다룰 수 있습니다. 이번 포스팅에서는 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 클래스 사용법

DataLoaderDataset을 보다 효율적으로 다룰 수 있도록 도와줍니다. 특히, 다음과 같은 기능을 제공합니다.

  • 배치(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)

마지막으로, 실제로 DatasetDataLoader를 활용하여 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에서 DatasetDataLoader를 활용하여 데이터를 로딩하고 변환하는 방법을 살펴보았습니다. Dataset을 상속하여 사용자 정의 데이터셋을 만들고, DataLoader를 사용하여 배치 단위로 데이터를 로딩하는 과정이 중요합니다. 또한, transforms를 활용하여 이미지 데이터를 변환하고, 사용자 정의 Transform을 적용하는 방법도 배웠습니다.

PyTorch를 활용한 딥러닝 모델 개발에서 데이터 전처리는 필수적인 과정이므로, 본 내용을 바탕으로 다양한 데이터셋을 다루는 연습을 해보시기 바랍니다.

728x90