데이터로더의 동작 원리 알아보기

딥러닝을 위한 코드를 작성할 때, 주로 사용하게 되는 로직이 데이터로더입니다.

주로 아래 코드를 통해서 import 하여 사용하게 되죠.

이 모듈의 로직이 어떤 식으로 동작되는지 간단한 코드를 통해 알아보겠습니다.

				
					from torch.utils.data import DataLoader, Dataset
				
			

코드

코드의 동작 로직을 살피기 위하여 아래와 같은 예시 코드를 준비했습니다.

				
					import torch
from torch.utils.data import DataLoader, Dataset

# Dataset 클래스 정의
class NumberDataset(Dataset):
    def __init__(self):
        self.data = torch.arange(1, 101)  # 1부터 100까지의 숫자 데이터

    def __len__(self):
        return len(self.data)  # 데이터셋의 크기 반환

    def __getitem__(self, idx):
        return self.data[idx]  # 주어진 인덱스에 해당하는 데이터 반환

# Dataset 인스턴스 생성
dataset = NumberDataset()

# DataLoader 인스턴스 생성
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

# DataLoader를 사용하여 데이터를 미니배치로 불러오기
for i, batch in enumerate(dataloader):
    print(f"Batch {i+1}:")
    print(batch)

				
			

NumberDataset() 라는 Class 는 Dataset 의 각종 method 를 상속받아 지정하는 데이터셋입니다.

def __init_(self) 을 통해서 해당 Class 에서 사용할 데이터를 지정합니다. 

여기서는 1부터 100까지의 숫자 tensor 를 data 라는 변수에 넣어주고 있죠?

이후 중요한 동작은 def __len__(self), def __getitem__(self, idx) 입니다.

len 쪽에서는 전체 데이터의 길이를 반환해줘야 하며, 

getitem 쪽에서는 앞에서 지정한 data 의 idx (몇 번째) 아이템을 반환할지 정합니다.

				
					
# Dataset 인스턴스 생성
dataset = NumberDataset()

# DataLoader 인스턴스 생성
dataloader = DataLoader(dataset, batch_size=10, shuffle=True)

# DataLoader를 사용하여 데이터를 미니배치로 불러오기
for i, batch in enumerate(dataloader):
    print(f"Batch {i+1}:")
    print(batch)

				
			

dataset 을 상속받아 내가 직접 만든 NumberDataset() 을 dataset 이라는 평범한 이름으로 다시 지정합시다.

이 데이터셋은 개수와 아이템을 반환 가능하죠?

이 데이터셋을 DataLoader 내부에 5번줄처럼 묶어줍시다.

이때, 주요 설정으로 batch_size 가 있습니다. 이건 한 번의 배치에서 몇 개의 아이템을 뽑아낼 거냐는 뜻입니다.

shuffle 을 True 로 설정하면, batch_size 에서 설정한 개수의 아이템을 빼낼 때, 섞어진 상태로 뽑을 거란 뜻입니다.

결과적으로 위와 같은 반복문을 실행하면 아래처럼 결과가 쭉 나타날 겁니다.

				
					Batch 1:
tensor([27, 47, 37, 49, 26, 88, 31, 95, 53, 85])
Batch 2:
tensor([ 2, 48,  7, 90, 42,  5, 74, 44, 55, 80])
Batch 3:
tensor([ 3, 18, 36, 79, 72, 34, 71, 12, 58, 84])
Batch 4:
tensor([35, 52, 96, 38,  6, 59, 87, 92, 17, 78])
Batch 5:
tensor([ 82,  70,  19, 100,  65,  25,  98,  76,  15,  94])

				
			

하나의 배치당 10개의 아이템을 가진 tensor 가 반환되는 것을 확인 가능합니다.

마치며..

딥러닝을 위해서 주요적으로 사용되는 로직을 정리할 생각입니다.

이렇게 아주 간단한 코드를 이용해서 실제로 작동되는 것을 print 를 통해 확인하는 게 저는 이해가 잘 되더군요ㅎㅎ