Data/머신러닝 & 딥러닝

Custom Dataset tutorial - Fashion MNIST

빛날희- 2022. 1. 25. 13:20

Dataset과 Dataloader로 fashion- MNIST데이터를 불러오고 커스텀하는 방법을 실습해보았다. 

코드는 pytorch tutorials에서 다운받을 수 있다. 

 

▶ Fasion MNIST

60,000개의 train10,000개의 test 데이터로 이뤄져있다. 각각의 예제는 28x28의 흑백이미지로 구성된다. 라벨은 총 10개의 클래스로 이뤄져 있다. 

데이터 셋은 torchvision의 datasets에서 다운받을 수 있다. datasets.FashionMNIST에 들어가는 인자는 다음과 같다. 

- root: train과 test데이터 셋이 저장될 장소

- train: train 데이터인지 test데이터인지 bool로 설정

- download= True: 인터넷에서 다운로드 받을건지 bool로 설정.

- transform: feature과 label의 형태 변환 방법 정의

 

 

▶ 데이터 불러오기

root로 지정한 data에 데이터셋이 저장된 것을 볼 수 있다. transform을 통해 해당 이미지를 Tensor형태로 정의한다. 

 

training_data를 출력해보면 다음과 같이 나온다. 

 

 

▶ 이미지 출력해보기

랜덤으로 8개의 샘플을 뽑아 이미지를 출력해보면 다음과 같다. 

randint는 균일분포의 정수 난수를 1개 생성하는 함수이다. size를 통해 output tensor의 shape을 정의한다. 해당 코드에선 다음과 같이 하나의 값만 출력하도록 설정했다. 

또한 squeeze를 통해 2차원으로 변환 후 이미지를 출력했다. 

출력된 이미지는 다음과 같다, 

 

 

▶ Custom dataset만들기

Dataset class에는 다음과 같이 __init__, __len__, __getitem__ 총 3가지 함수가 기본으로 들어간다. 

- annotations_file: 라벨이 저장되어 있는 csv 파일

- img_dir: FashionMNIST이미지가 저장되어있는 디렉토리

 

세가지 함수를 차례차례 살펴보자. 

__init__

init함수는 Dataset객체가 선언될 때 한번 실행되는 함수이다. 라벨과 이미지 데이터, transform과 target_transform방식 값들을 초기화해준다. 

여기서 annotations_file은 다음 그림과 같이 [파일이름, 라벨] 형태로 되어있기 때문에 위코드와 같이 정의한다. 

 

▷ __len__

샘플 수를 반환한다. 

 

__getitem__

idx를 넘겨주면 인덱스에 해당하는 샘플을 정의한 형태로 변환해서 돌려준다. 

이미지의 경우 인덱스에 해당하는 값을 disk에서 찾아 read_image함수를 통해 inage를 불러온 후 tensor로 변환해준다. 

라벵의 경우, 인덱스에 해당하는 값을 찾아 target_transform 을 적용해준다.

그리고 변환된 값들을 image,label로 반환한다. 

 

 

▶ DataLoader

Dataset을 통해 변환한 데이터들을 dataloader에서 미니배치 형식으로 모델에 전달한다. DataLoader는 모델의 과적합을 줄이기 위해 매 에폭마다 데이터를 reshuffle하고, 빠른 응답처리를 위해 multiprocessing을 활용하는 과정을 쉽게 사용할 수 있도록 해준다.

batch size를 64로 설정했으므로 이미지를 64개씩 묶어서 처리한다. 

그 배치 셋들 중 하나의 이미지를 라벨과 함께 출력하면 다음과 같다.