본문 바로가기
AI Framework/PyTorch

[PyTorch] 5주차: 데이터셋 및 DataLoader

by cogito21_python 2024. 5. 30.
반응형

강의 목표

  • PyTorch에서 데이터셋을 다루는 방법 이해
  • torch.utils.data.Dataset 및 torch.utils.data.DataLoader 클래스 사용법 습득
  • 데이터 전처리 및 배치 처리를 통한 효율적인 데이터 관리 방법 이해

강의 내용

1. 데이터셋 다루기

  • PyTorch Dataset 클래스
    • Dataset 클래스는 데이터셋을 추상화하여 데이터 로드 및 전처리를 쉽게 할 수 있도록 합니다.
    • 커스텀 데이터셋을 작성하여 다양한 데이터 형식 지원
     
import torch
from torch.utils.data import Dataset

class CustomDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels

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

    def __getitem__(self, idx):
        sample = self.data[idx]
        label = self.labels[idx]
        return sample, label

 

2. DataLoader 사용법

  • DataLoader 클래스
    • DataLoader는 데이터셋을 배치로 나누고, 데이터셋을 순회할 수 있는 반복자(iterator)를 제공합니다.
    • 배치 크기 설정, 셔플링, 병렬 데이터 로딩 지원
     
from torch.utils.data import DataLoader

# 예시 데이터
data = torch.randn(100, 10)  # 100개의 샘플, 각 샘플은 10개의 특징
labels = torch.randn(100, 1)  # 100개의 샘플에 대한 타겟 값

# 커스텀 데이터셋 생성
dataset = CustomDataset(data, labels)

# DataLoader 생성
dataloader = DataLoader(dataset, batch_size=16, shuffle=True)

# DataLoader 사용 예시
for batch_data, batch_labels in dataloader:
    print(batch_data, batch_labels)

 

3. 데이터 전처리

  • 데이터 전처리 및 변환
    • torchvision.transforms 모듈을 사용하여 이미지 데이터 전처리
    • 사용자 정의 변환 작성
     
from torchvision import transforms

# 이미지 데이터 전처리 예시
transform = transforms.Compose([
    transforms.Resize((128, 128)),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

# 사용자 정의 변환 예시
class AddGaussianNoise(object):
    def __init__(self, mean=0.0, std=1.0):
        self.mean = mean
        self.std = std

    def __call__(self, tensor):
        return tensor + torch.randn(tensor.size()) * self.std + self.mean

    def __repr__(self):
        return self.__class__.__name__ + '(mean={}, std={})'.format(self.mean, self.std)

transform_with_noise = transforms.Compose([
    transforms.Resize((128, 128)),
    transforms.ToTensor(),
    AddGaussianNoise(0.0, 0.1)
])

 

 

4. 데이터셋 분할

  • 훈련 데이터셋과 검증 데이터셋으로 분할
    • torch.utils.data.random_split 사용
     
from torch.utils.data import random_split

# 데이터셋 분할
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])

# DataLoader 생성
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)

 

5. 실습 및 과제

  • 실습 과제
    • 커스텀 데이터셋 작성 및 DataLoader를 사용하여 데이터 로드
    • 이미지 데이터 전처리 및 변환 적용
    • 데이터셋을 훈련과 검증 데이터셋으로 분할하고, 각 데이터셋에 대한 DataLoader 작성
     
# 실습 과제 예시
import torch
from torch.utils.data import Dataset, DataLoader, random_split
from torchvision import transforms

class CustomDataset(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):
        sample = self.data[idx]
        label = self.labels[idx]
        if self.transform:
            sample = self.transform(sample)
        return sample, label

# 예시 데이터
data = torch.randn(100, 3, 32, 32)  # 100개의 이미지 데이터 (3채널, 32x32)
labels = torch.randint(0, 10, (100,))  # 100개의 레이블 (0~9)

# 데이터 전처리 변환
transform = transforms.Compose([
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 커스텀 데이터셋 생성
dataset = CustomDataset(data, labels, transform=transform)

# 데이터셋 분할
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])

# DataLoader 생성
train_loader = DataLoader(train_dataset, batch_size=16, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=16, shuffle=False)

# DataLoader 사용 예시
for batch_data, batch_labels in train_loader:
    print(batch_data, batch_labels)

 

  • 과제 제출
    • Jupyter Notebook 파일로 제출
    • 제출 기한: 다음 강의 시작 전까지
반응형