[Pytorch] torch.utils.data의 Dataset과 DataLoader
2021. 8. 1. 13:26ㆍDeep Learning/framework
728x90
torch.utils.data.Dataset
이 클래스를 상속받아 Dataset instance를 생성해주는 class 구현
torch의 dataset은 두가지의 형식이 있음
- Map-style dataset
- index가 존재해 data[index]로 데이터 참조가 가능하다.
- __getitem__과 __len__의 오버라이팅이 필요하다.
- ‘__len__’ 에서는 학습 데이터의 갯수를 리턴해주고, ‘ __getitem__’ 에서는 파일 경로가 담긴 리스트의 인덱스값을 참조해 해당 이미지를 연 다음 tensor 자료형으로 바꾸어 이미지 전처리를 실행하는 구조이다. - 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
- batch의 길이가 다른 경우 - loss를 구하기 귀찮은 경우가 생기고
- 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 |