Dataset
Dataset class 정의는 전체 dataset을 구성하는 단계이다. input으로는 전체 input feature와 label(=target)을 넣어주면 된다.
dataset class를 정의하려면 필수로 정의해야 하는 함수들이 있는데 다음과 같다.
- __init__(self) : 필요한 변수들을 선언한다. self.~~ = ~~~ 이런식으로
- __len__ : dataset의 사이즈를 return
- __getitem__ : i번째 data를 return. return type에 제약이 있는 것은 아니지만, 보통 tensor, a tuple of tensors, a dictionary를 많이 쓰는 듯 하다.
- 하나의 변수에 target이 함께 있는 경우도 있고, target을 따로 return하는 경우도 있음.
- unsupervised learning의 경우에는 target을 return하지 않는 경우가 많음
참고 : https://stackoverflow.com/questions/67416496/does-pytorch-dataset-getitem-have-to-return-a-dict
* custom dataset
- 많은 양의 data를 학습시킬 때, 너무 많은 양의 data를 한 번에 메모리에 로딩시키면, 시간이 오래걸릴 뿐 아니라 RAM이 터지는 일이 발생한다. 데이터를 한 번에 다 로딩시키지 않고 하나씩만 불러서 쓴다면 메모리가 터지지 않고 모델을 돌릴 수 있다. 그래서 모든 데이터를 한 번에 로드해서 쓰는 것이 아닌 조금씩 불러서 쓸 때 dataset class를 customize한다고 한다.
DataLoader
: batch 기반의 딥러닝 모델 학습을 위해서 mini batch를 만들어주는 역할을 한다. dataLoader를 통해 dataset의 전체 데이터가 batch size로 slice된다. 앞서 정의한 dataset을 인자로 넣어주면 여러 옵션(shuffle, batch_size, num_workers 등등)을 통해 batch를 만들어준다. 서버에서 돌릴 때는 num_worker를 조절해서 load속도를 올릴 수 있다. 하지만 PC에서는 default로 설정해야 오류가 안난다.
정리>
지금까지 계속 전체 code를 보고 있어서 dataset과 dataLoader가 떨어져 있다보니, 실제 fit에서 어떻게 data를 활용하는 지에 대해서 이해를 하지 못했다.
그래서 구글링을 해봤는데, 내가 원하는 답이 나오지 않았고, 이참에 이걸 주제로 포스팅을 하면서 정리해보자 하는 도중, 코드를 유심히 보니 이제 알겠다.
1. dataset에서 data들 format을 정해놓고, 2. dataLoader에서 iterable하게 dataset을 감싸고, 3. fit()안에서 dataLoader에서 dataset의 변수에 참조를 하고 싶으면, __getitem__에서 정의한대로 꺼내서 쓴다.
사진 코드 >
https://sept-moon.tistory.com/57
https://sept-moon.tistory.com/56참고자료>https://pytorch.org/tutorials/beginner/data_loading_tutorial.html