본문 바로가기

딥러닝/Pytorch

파이토치의 데이터셋:Dataset,DataLoader,Transforms

2021-09-15 목차 만드는 법을 배워서 추가중~~
2021-09-18  다형성->상속으로 변경

개요
Dataset

 

 

 

 

 

개요

부스트캠프 ai tech 2기도 어느새 3주차에 접어들면서 파이토치에 대해서 이것저것 공부하고 있습니다.

파이토치의 실습과제를 진행하는데 , 데이터셋을 만드는 부분에서 상당히 애를 먹었습니다. 과제의 순서에 따라서 필요한 기능을 찾으면서 문제푸는데에 초점을 맞추다 보니 논리적인 프로세스가 단단하게 확립이 안되었다고 느꼇습니다. 따라서, 오늘은 파이토치의 데이터셋을  어떻게 모델에 input으로 feed 하는 논리적인 과정을 알아보도록 하겠습니다.

 

일반적으로 머신러닝 프레임워크에서는 아래와 같은 과정으로 데이터를 Model에 feed 해줍니다.

저희는 Pytorch에서  노란색 형광색으로 표현한 기능을 어떻게 제공을 해주는 지 알아보도록 하겠습니다.

 

 

 

Dataset

 

 

1.Define

Pytorch에서 Dataset을 만들때에는  Dataset클래스를 상속(inheritance)하여 만들게 됩니다. 유저의 개발시간이 단축되도록 도와줍니다.

 

Identify feature and label sources의 부분은 Dataset Class 정의부분에서 이루어집니다.

Ex)

class CustomDataset(Dataset):

    def __init__(selftextlabels):

        self.labels = labels

        self.data = text

    def __len__(self):

        return len(self.labels)

 

    def __getitem__(selfidx):

        label = self.labels[idx]

        text = self.data[idx]

        sample = {"Text": text, "Class": label}

        return sample

 

Pytorch에서 데이터셋을 생성할 때에는, __init__,__len__,__getitem_을 구현해줘야 생성이 가능합니다.여기에서, label이 있는경우 , __init__에서 멤버변수로 label,feature 를 정의 해주면 됩니다.

주의할점으로는, training 단계에서 update가 필요한경우, tensor로 값을 넣어줘야 gradient 계산이 가능하다는 점입니다.

 

 

2.Support Type

 

Docs에 따르자면, Pytorch에서 지원하는 Dataset type은 두가지입니다.

 

1.Map style Dataset

2.Iterable style Dataset

 

 

Map style Dataset은 시퀸스 타입에 지원되는 연산인 index 방식으로 데이터를 리턴하는 __getitem__을 구현해서 data를 로딩합니다. 한번에 메모리에 올릴 수 있는 데이터면서,  저장된 데이터가 변동되어있지 않는 경우(Bounded Data) index방식으로 참조하는것이 가능할 것입니다.

 

하지만, 한번에 메모리에 올릴 수 없다면, 데이터가 처리 되는 와중에 새로운 데이터가 들어온다면(Unbounded data) 똑같이 Map Style Dataset방식으로 처리할까요?

 

가능은합니다만, 미리 전처리를 해줘야하는 불편함이 있습니다.  파이썬에서 , 크기가 정해지지 않은 데이터를 참조하는 내장형 타입이 있습니다. 바로, iterator입니다. iterator는 값을 참조하는 순간 메모리에 값을 올리기 때문에 이론적으로 무한크기의 데이터를 처리하는 것이 가능합니다. 

 

 

Transformation

그 외의 , Feature Engineering clean Data 는 Loading을 하기전에 다 처리를 해주는 과정을 거칠 것이기 때문에 .

transform=transforms.Compose([
    transforms.Resize((224,224)),
    transforms.RandomVerticalFlip(p=0.5),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ToTensor()
])

 

Pytorch에 torchvisions 에있는 transforms.Compose 메소드를 사용해 줄 것입니다. 

 

 

 , Split the Data,는 DataLoader로 처리해주시면 됩니다.

 

 

아직작성 중

 

08/26수정(DataSet 클래스에서 transform 하도록 수정)

 

Reference:https://medium.com/speechmatics/how-to-build-a-streaming-dataloader-with-pytorch-a66dd891d9dd

https://pytorch.org/docs/stable/data.html#torch.utils.data.Dataset

https://developers.google.com/machine-learning/data-prep/process?hl=ko 

https://woongjun-warehouse.tistory.com/52?category=885725