이것저것 기록

[DL, PyTorch] Dataset과 DataLoader 본문

Data Science/ML & DL

[DL, PyTorch] Dataset과 DataLoader

anweh 2020. 10. 14. 10:39

 

PyTorch의 Dataset과 DataLoader를 이용하면 학습을 위한 방대한 데이터를 미니배치 단위로 처리할 수 있고, 데이터를 무작위로 섞음으로써 학습의 효율성을 향상시킬 수 있다. 또한 데이터를 여러개의 GPU를 사용해 병렬처리로 학습할 수도 있다.

코드가 매우 간단해지고, 사용법만 익히면 학습을 편하게 도와주는 편리한 함수다. 

 

 

사실 데이터셋의 크기가 그렇게 크지 않으면 굳이 사용하지 않아도 되지만,

데이터셋의 크기가 매우 큰 경우엔 모든 데이터를 한 번에 넣어서 처리하는 방식을 적용하기엔 무리가 있다.

그래서 Batch 라는 개념으로 (묶음) 한 번에 한 묶음씩 처리하는 방식을 사용하게 된다. 

정리하면, 전체 데이터셋을 batch로 묶어서 iteration의 수 만큼 실행하는 것이다. 

 

이것을 구현하기 위해선 전체 데이터셋을 batch로 나누고, batch 내의 각각의 데이터를 forward와 backward를 돌리는 식으로 진행해야하는데 (한마디로 매우 번거로워짐) 

PyTorch의 Dataloader를 사용하면 그런 귀찮음이 줄어든다. 


1. Custom Dataset의 구성

참조: wingnim.tistory.com/33?category=772392

  • __init__(self): download, read data 등등을 하는 파트
  • __getitem__(self, index): 인덱스에 해당 아이템을 넘주는 파트
  • __len__(self): data size를 넘겨주는 파트 

 

 

2. DataLoader 구현 (기본 구조)

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


class MyDataset(Dataset):
 
    # Initialize your data, download, etc.
    def __init__(self):
    	# download, read data

    def __getitem__(self, index):
        return 
        # return one item on the index

    def __len__(self):
        return 
        # return the data length


dataset = MyDataset()
train_loader = DataLoader(dataset=MyDataset,
                          batch_size=32,
                          shuffle=True,
                          num_workers=2)

일반적으로 이렇게 PyTorch의 Dataset클래스를 상속받아서 사용자 정의 Dataset Class를 만들고 __getitem__, __len__을 overriding 해서 사용한다. 

학습을 위한 loader을 생성할 땐 (train_loader) dataset 인자에 각자가 만든 class를 넣어주면 된다.

나같은 경우 dataset이름이 MyDataset이니까 그렇게 넣어줬다. 

 

 

 

참고: deepbaksuvision.github.io/Modu_ObjectDetection/posts/03_01_dataloader.html

 

01). DataLoader · GitBook

No results matching ""

deepbaksuvision.github.io

 

Comments