728x90

안녕하세요, 오늘은 PyTorch의 가장 중요한 구성 요소 중 하나인 DataLoader에 대해 자세히 알아보려고 합니다. 이 포스트에서는 DataLoader의 기능, 파라미터, 그리고 실제 사용 예시에 대해 소개해드리려고 합니다.

 

DataLoader란?


PyTorch의 'DataLoader'는 'Dataset' 클래스의 데이터들을 불러오게 하는 데이터셋 객체입니다. 모든 Dataset은 DataLoader로 생성하며 DataLoader는 모델 훈련을 위한 데이터를 준비하는 과정을 쉽고 효율적으로 만들어 줍니다.

DataLoader를 사용해야하는 이유는 다음과 같습니다.

  • 미니배치 : 'DataLoader'은 데이터셋을 미니배치로 나누어 학습을 가능하게 하여 각자의 GPU 환경에 맞춰서 학습할 수 있도록 합니다.
  • 데이터 셔플링 : 학습 과정에서 데이터를 무작위로 섞어주는 기능을 제공하여, 일반화 능력을 향상합니다.
  • 병렬 데이터 로딩: num_workers 파라미터를 통해 다중 프로세스를 사용하여 데이터 로딩 시간을 단축시킬 수 있습니다. 이는 특히 대규모 데이터셋을 다룰 때 학습 시간을 크게 줄여줍니다.
  • 사용자 정의 데이터 처리: collate_fn을 사용하여 배치 데이터를 생성하는 과정에서 사용자 정의 데이터 처리 로직을 적용할 수 있습니다. 이는 다양한 형태의 데이터(예: 이미지의 크기가 다른 경우, 텍스트 데이터의 길이가 다른 경우)를 효과적으로 처리할 수 있게 해 줍니다.
  • 데이터 로딩의 유연성: 다양한 소스에서 데이터를 로딩할 수 있는 유연성을 제공합니다. Dataset 추상 클래스를 상속받아 파일 시스템, 데이터베이스, 온라인 소스 등에서 데이터를 쉽게 로딩할 수 있습니다.

 

DataLoader의 정의

DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
           batch_sampler=None, num_workers=0, collate_fn=None,
           pin_memory=False, drop_last=False, timeout=0,
           worker_init_fn=None)

 

주요 파라미터 설명

파라미터 설명
dataset (Dataset) 로딩할 대상 데이터셋. PyTorch의 Dataset 인스턴스
batch_size(bool, optional) 한 번에 로드할 데이터의 개수. 이 값에 따라 모델의 메모리 사용량과 훈련 속도가 달라질짐.
shuffle (bool, optional) 데이터를 로드하기 전에 무작위로 섞을지의 여부. 일반적으로 훈련 데이터셋에는 True를 설정.
num_workers (int, optional) 데이터 로딩을 위해 사용할 프로세스의 수. 이 값을 늘림으로써 데이터 로딩 속도를 향상시킬 수 있음.  무작정 많이 올린다고 속도가 향상되는 것은 아님
collate_fn (callable, optional) 배치 데이터를 처리하는 사용자 정의 함수. 데이터셋에서 샘플을 배치로 묶는 방법을 커스터마이징.
drop_last (bool, optional) 마지막 배치의 데이터 수가 batch_size보다 적을 경우 이를 버릴지에 대한 여부.

 

 

 

 

구현 예제


Dataset 구현 코드

더보기

데이터셋 구현 코드 

import torch
from torch.utils.data import Dataset

# 사용자 정의 데이터셋 클래스
class CustomDataset(Dataset):

	# 생성자, 데이터를 전처리하는 부분
    def __init__(self, length=100):
        self.data = torch.randn(length, 10)  # 임의의 데이터 생성 (예: 100x10 텐서)
        self.labels = torch.randint(0, 2, (length,))  # 임의의 레이블 생성 (0 또는 1)

	# Dataset 클래스의 길이를 반환
    def __len__(self):
        return len(self.data)

	# 데이터셋의 데이터중 idx위치의 Data를 반환하는 코드
    def __getitem__(self, idx):
        sample = self.data[idx]
        label = self.labels[idx]

        return sample, label
        
# 데이터셋 생성
dataset = CustomDataset()

 

from torch.utils.data import DataLoader

# DataLoader의 파라미터를 사용하는 예시

# DataLoader 인스턴스 생성
data_loader = DataLoader(
    dataset=dataset,      	# 사용할 데이터셋
    batch_size=24,      	# 배치 사이즈 설정: 한 번에 로드할 데이터의 개수
    shuffle=True,          	# 데이터 셔플링 활성화: 데이터를 무작위로 섞음
    num_workers=4,         	# 병렬 데이터 로딩을 위한 프로세스 수: 데이터 로딩 속도 향상
    drop_last=True         	# 마지막 배치 드롭 설정: 마지막 배치의 데이터 수가 batch_size보다 적을 경우 이를 버릴지 여부
)

# 설명
# batch_size


# DataLoader를 사용하여 데이터 로딩 및 처리 예시
for data, labels in data_loader:
    print(f"Batch shape: {data.shape}, Labels shape: {labels.shape}")

# 실행결과
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])
Batch length: 24, Batch shape: torch.Size([24, 10]), Labels shape: torch.Size([24])

 

설명

DataLoader에서 Data는 100개를 가지고 있으며 Batch size는 24입니다. Batch size를 24로 설정하면 DataLoader은 24개의 데이터를 담은 미니배치로 분할합니다. 총 데이터는 100개이므로, 이는 DataLoader가 총 5개의 미니배치를 가지며 4개의 미니배치는 24개의 데이터(24 * 4 = 96)와 1개의 미니배치는 4개의 데이터를 갖고 있습니다.

이 때, 데이터셋의 총 크기(100)가 배치 크기(24)로 정확히 나누어 떨어지지 않기 때문에, 마지막 배치는 나머지 데이터로 구성됩니다. 이 경우 마지막 배치에는 4개의 데이터 포인트만 포함됩니다. 'drop_last=True' 파라미터에 의해 마지막 배치는 학습과정에 포함되지 않습니다.

 

728x90