pytorch dataset과 dataloader 기본개념 재활

1. dataset class

 

1-1) torch.utils.data에 존재하는 라이브러리?

 

주어진 Vanilla data를 “모델이 좋아하는 dataset”으로 변환시켜줌

 

원하는 augmentation이나 preprocessing 방식도 추가 가능

 

미리 만든 MNIST같은 데이터셋 말고도 어떠한 데이터에 대해서도 새로 만든 dataset class가 필요함

 

 

1-2) 기본 구조

 

Mydataset이라는 class는 torch.utils.data의 Dataset의 기능들을 전부 가졌으면 해서 Dataset을 상속받음

 

dataset의 기본구조

 

다음 3가지는 dataset이라는 class가 가져야할 기본 기능이다.

 

1) __init__는 Mydataset이 처음 선언되면 최초 1번 호출되는 함수

 

보통 Vanilla data의 위치나 경로같은 metadata를 지정

 

2) __getitem__은 dataset이라면 원하는 index의 데이터를 뽑아줄 수 있는 함수가 구현되어 있어야함

 

__init__에 지정된 파일을 읽어 data array를 뱉어낼 수 있어야함

 

3) __len__은 dataset이 가지는 모든 데이터의 총 개수

 

이들을 구현하면, ”torch 기반의 어떤 곳이든 쓸 수 있는” dataset이 완성

 

 

1-3) 예시로 이해하는 dataset

 

Mydataset을 다음과 같이 아주 간단하게 구현

 

 

test=MyDataset()으로 선언하면서 __init__이 최초 1회 호출

 

__getitem__은 class가 리스트처럼 self[key]가 어떻게 동작할지  indexing을 할 수 있도록 기능을 제공함

 

2341번 index의 데이터를 return하도록 함수를 구현했음.. 여기서는 간단히 index를 그대로 return하도록

 

__len__은 dataset class에 len()을 쓰면 데이터의 총 수를 return하도록 구현

 

 

2. dataloader는 무엇일까

 

2-1) 의미

 

dataset class만 완성해도 원하는대로 데이터를 뽑아낼 수 있는 기능을 잘 구현하면 뽑아낼 수 있겠지만

 

조금 더 효율적으로 데이터를 뽑아낼 수 있는 여러 tool같은 것이 있다면?

 

data를 여러 CPU에 병렬처리해야할 수도 있고 batch단위로 처리해야할 수도 있고, …

 

dataloader에서 한번에 묶어서 보내줄 수 있다면 더이상 내가 해야할 다른 작업은 딱히 불필요하다.

 

dataloader는 이렇게 dataset에서 data를 더욱 효율적으로 뽑아내기 위해 관련 기능이 들어간 util 개념이다.

 

 

2-2) 자주 쓰이는 기능

 

batch_size는 데이터를 한번에 몇 단위로 묶어서 처리할지 batch 크기를 지정

 

보통 32batch, 64batch같은거 쓰더라도 거의 마지막 남은 데이터들은 32개, 64개로 묶기 애매하게 남은 경우가 많은데

 

1) drop_last=True를 하면 애매하게 남은 데이터들을 묶지 말고 없애달라는 의미

 

그 외에 shuffle, sampler, collate_fn 같은 것도 주요 기능

 

2) shuffle은 데이터 batch를 만들 때 매 epoch마다 랜덤하게 섞어서 만들어주고

 

3) sampler는 데이터를 뽑을 때 전략을 설정하는 것으로 torch.util.data.Sampler라는 class를 받는 것 같음

 

4) collate_fn은 batch마다 무슨 함수를 적용해주고 싶을 때 사용함

 

 

2-3) num_workers?

 

data loading하면서 처리할 CPU thread의 수?

 

너무 많은 workers는 오히려 효율이 떨어진다.

 

어떤 값이 나에게 맞는지 실험을 통해 찾아봐야함

 

데이터 generation에 CPU 성능도 그만큼 중요하다는 의미

 

num_workers=3이 데이터 뽑는 속도가 조금 더 빠름

 

3. dataset과 dataloader는 무슨 차이인가

 

둘은 기능 자체가 다르다

 

dataset은 vanilla data를 모델이 좋아하는 dataset으로 바꿔주는 class

 

dataloader는 dataset class에서 data를 효율적으로 뽑아주도록 도와주는 기능

 

물론 dataset에 dataloader기능을 구현할 수는 있지만 모델 개발이나 재활용측면에서도 분리하는 것이 좋다

 

dataloader는 그냥 dataset만 바꿔주면 재활용이 쉽게 가능하니까

 

dataset과 dataloader의 차이

 

TAGS.

Comments