티스토리 뷰

MachineLearning

[ML] PyTorch Dataset, DataLoader

SweetDev 2021. 10. 13. 14:45

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)

Dataloader class는 batch기반의 딥러닝모델 학습을 위해서 mini batch를 만들어주는 역할을 한다. dataloader를 통해 dataset의 전체 데이터가 batch size로 slice된다. 앞서 만들었던 dataset을 input으로 넣어주면 여러 옵션(데이터 묶기, 섞기, 알아서 병렬처리)을 통해 batch를 만들어준다. 서버에서 돌릴 때는 num_worker를 조절해서 load속도를 올릴 수 있지만, PC에서는 default로 설정해야 오류가 안난다.

 

import torch.utils.data

tr_dataset = BasicDataset(train_x, train_y)
train_loader = data.DataLoader(dataset=tr_dataset, batch_size=128, num_workers=8, shuffle=True)

* dataset에는 앞서 생성한 Datset instance가 들어간다.

sampler

index를 control하는 방법. 데이터셋이 균형잡히지 않은 경우 클래스의 비율에 맞게 끔 데이터의 순서를 바꿔서 제공하고 싶을 수 있다. 이때 사용하는 것이 sampler이다.

shuffle=False여야 사용할 수 있다. map-style에서 control을 위해서 사용하며, __len__과  __iter__을 구현하면 된다.  아니면, 다음과 같은 Sampler들을 사용해서도 사용할 수 있다. 

  • SequentialSampler : 항상 같은 순서
  • RandomSampler : 랜덤, replacemetn 여부 선택 가능, 개수 선택 가능
  • SubsetRandomSampler : 랜덤 리스트, 위와 두 조건 불가능
  • WeigthRandomSampler : 가중치에 따른 확률
  • BatchSampler : batch단위로 sampling 가능
  • DistributedSampler : 분산처리 (torch.nn.parallel.DistributedDataParallel과 함께 사용)

pin_memory

Tensor을 CUDA 고정 메모리에 할당시키는 옵션.고정된 메모리에서 데이터를 가져오기 때문에 데이터 전송이 훨씬 빠르다. 

  • Pageable Memory: Memory 내용(contents)이 DRAM에서 하드디스크 (Secondary Storage Device)로 page out 되거나 반대로 하드디스크에서 DRAM으로 page in이 가능한 메모리를 의미합니다. Page in/Page out을 하기 위해서는 CPU (Host)의 도움이 필요하다고 합니다. 보통 OS에서 User Memory Space의 경우 Pageable Memory입니다.
  • Non-Pageable Memory: Pageable Memory와 반대로 page in/page out이 불가능한 메모리를 Non-Pageable Memory라 합니다. 결과적으로 하드디스크로 데이터를 page out/page in 하는 작업이 필요없습니다. OS에서 Kernel Memory Space는 보통 Non-Pageable Memory라고 합니다.

https://mkblog.co.kr/2017/03/07/nvidia-gpu-pinned-host-memory-cuda/

drop_last

batch 단위로 데이터를 불러온다면, batch_size에 따라 마지막 batch의 길이가 달라질 수 있습니다. batch의 길이가 다른 경우에 따라 loss를 구하기 귀찮은 경우가 생기고, batch의 크기에 따른 의존도 높은 함수를 사용할 때 걱정이 되는 경우 마지막 batch를 사용하지 않을 수 있다.

 

worker_init_fn

num_worker가 개수라면, 이 파라미터는 어떤 worker를 불러올 것인가를 리스트로 전달합니다.

 

 

참고로 torch의 dataset은 2가지 스타일이 있습니다.

  • Map-style dataset
    • index가 존재하여 data[index]로 데이터를 참조할 수 있음
    • __getitem__과 __len__ 선언 필요
  • Iterable-style dataset
    • random으로 읽기에 어렵거나, data에 따라 batch size가 달라지는 데이터(dynamic batch size)에 적합
    • 비교하자면 stream data, real-time log 등에 적합
    • __iter__ 선언 필요

이 점을 유의하며 아래의 파라미터 설명을 읽으면 더 이해가 쉽습니다.

 

batch_size

  • int, optional, default=1

배치(batch)의 크기입니다. 데이터셋에 50개의 데이터가 있고, batch_size가 10라면 총 50/10=5, 즉 5번의 iteration만 지나면 모든 데이터를 볼 수 있습니다

[출처]

https://sanghyu.tistory.com/90

https://subinium.github.io/pytorch-dataloader/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함