[Pytorch] torch.utils.data의 Dataset과 DataLoader

2021. 8. 1. 13:26Deep Learning/framework

728x90

torch.utils.data.Dataset

이 클래스를 상속받아 Dataset instance를 생성해주는 class 구현

torch의 dataset은 두가지의 형식이 있음

  1. Map-style dataset
    - index가 존재해 data[index]로 데이터 참조가 가능하다.
    - __getitem__과 __len__의 오버라이팅이 필요하다.
    - ‘__len__’ 에서는 학습 데이터의 갯수를 리턴해주고, ‘ __getitem__’ 에서는 파일 경로가 담긴 리스트의 인덱스값을 참조해 해당 이미지를 연 다음 tensor 자료형으로 바꾸어 이미지 전처리를 실행하는 구조이다.
  2. Iterable-style dataset
    - random으로 읽기에 어렵거나 data따라 batch size가 달라지는 데이터에 적합하다.
    - stream data, real-time log등에 적합하다.
    - __iter__오버라이팅이 필요하다.

(예)

import torch
from torch.utils.data import Dataset

class TestDataSet(Dataset):
    def __len__(self):
        return 10
    
    def __getitem__(self, index):
        return {"input":torch.tensor([index, 2*index, 3*index], dtype=torch.float32), 
                "label": torch.tensor(index, dtype=torch.float32)}

test_dataset = TestDataSet()

# DataLoader
dataloader = torch.utils.data.DataLoader(test_dataset, batch_size=4)
for data in dataloader:
    print(data)

# {'input': tensor([[0., 0., 0.],
#         [1., 2., 3.],
#         [2., 4., 6.],
#         [3., 6., 9.]]), 'label': tensor([0., 1., 2., 3.])}
# {'input': tensor([[ 4.,  8., 12.],
#         [ 5., 10., 15.],
#         [ 6., 12., 18.],
#         [ 7., 14., 21.]]), 'label': tensor([4., 5., 6., 7.])}
# {'input': tensor([[ 8., 16., 24.],
#         [ 9., 18., 27.]]), 'label': tensor([8., 9.])}
# 출처 https://gaussian37.github.io/dl-pytorch-dataset-and-dataloader/

torch.utils.data.DataLoader

mini batch 학습이나 데이터 셔플, 병렬처리등을 간단하게 구현할 수 있도록 해줌

Dataset 클래스를 상속받아 작성한 나만의 Dataset생성클래스 객체를 DataLoader에 넣어주고, 여러 파라미터 설정

핵심은 shuffle과 batch_size이다.

[parameters]

batch_size

  • int, optional, default=1
  • 배치(batch)의 크기
  • 반복문 돌리면( 위의 코드에서 for data in dataloader: ) (batch_size, *(data.shape))의 형태의 Tensor로 데이터 반환
  • 그러므로 Dataset에서 return 하는 모든 데이터는 Tensor로 변환되어야 

shuffle

  • bool, optional, default=False
  • 데이터를 DataLoader에서 섞어서 사용하겠는지를 설정할 수 있습니다.
  • torch.manual_seed를 고정하면 동일 실험 재현 가능
  • Dataset에서 initialize시 random.shuffle로 섞는 방법도 있다

sampler

  • Sampler, optional
  • torch.utils.data.Sampler 객체
  • sampler는 index를 컨트롤하는 방법
  • 데이터의 index를 원하는 방식대로 조정
  • index를 컨트롤하기 때문에 설정하고 싶다면 shuffle 파라미터는 False(기본값)여야 함
  • map-style에서 컨트롤하기 위해 사용

num_workers

  • int, optional, default=0
  • 데이터 로딩에 사용하는 subprocess개수(multiprocessing)
  • 기본값이 0인데 이는 data가 main process로 불러오는 것을 의미
  • 많이 사용하면 좋을까? -> CPU와 GPU사이 많은 교류는 병목을 불러올수도(trade-off)
    https://jybaek.tistory.com/799 글 참조

collate_fn

  • callable, optional
  • map-style 데이터셋에서 sample list를 batch 단위로 바꾸기 위해 필요한 기능
  • zero-padding이나 Variable Size 데이터 등 데이터 사이즈를 맞추기 위해 많이 사용

pin_memory

  • bool, optional
  • True로 선언하면, DataLoader는 Tensor를 CUDA 고정 메모리에 올림.

drop_last

  • bool, optional
  • batch 단위로 데이터를 불러온다면, batch_size에 따라 마지막 batch의 길이가 달라질 수 있음 (예)data의 개수는 27개인데, batch_size가 5라면 마지막 batch의 크기는 2

 

  1. batch의 길이가 다른 경우 - loss를 구하기 귀찮은 경우가 생기고
  2. batch의 크기에 따른 의존도 높은 함수를 사용할 때 걱정이 되는 경우
    -> 마지막 batch를 사용하지 않을 수 있는 파라미터

time_out

  • numeric, optional, default=0
  • 양수로 주어지는 경우, DataLoader가 data를 불러오는데 제한시간

worker_init_fn

  • callable, optional, default=’None’
  • (cf. num_worker=개수) 어떤 worker를 불러올 것인가를 리스트로 전달
728x90

'Deep Learning > framework' 카테고리의 다른 글

[Pytorch] model.eval()  (0) 2021.07.27
[Pytorch] torch.nn.Parameter  (0) 2021.07.26
JSON파일 Python 으로 다루기  (0) 2021.07.04
[Pytorch] Variable  (0) 2021.06.19
[pytorch] nn.Upsample  (0) 2021.06.16