Real Late Starter

[PyTorch] 4. Data Loader 본문

PyTorch

[PyTorch] 4. Data Loader

조슈아박 2020. 1. 23. 13:52

Data Loader

pytorch 공식 문서 : https://pytorch.org/docs/master/torchvision/datasets.html

 

torchvision.datasets — PyTorch master documentation

torchvision.datasets All datasets are subclasses of torch.utils.data.Dataset i.e, they have __getitem__ and __len__ methods implemented. Hence, they can all be passed to a torch.utils.data.DataLoader which can load multiple samples parallelly using torch.m

pytorch.org

데이터 로더는 왜 필요할까요?

 GPU와 CPU는 이미지를 배치 형태로 다룰 때 더 빨리 수행하도록 최적화 되있다고 합니다. 딥러닝에서도 GPU 환경을 자주 사용하기 때문에 일반적으로 이미지 데이터 등을 배치 처리 형태로 다룹니다.

 

파이토치는 Data를 배치 형태 또는 이미지 묶음 형태로 이용할 수 있도록 DataLoader라는 클래스를 제공합니다. 

DataLoader 클래스는 데이터셋을 받아들이고, 일련의 이미지를 반환합니다. 

 

또한 다음과 같은 것들을 해결하기 위해 사용합니다.

 

- input value setting

- batch나 epoch 등은 어떻게 설정해야하는가?

- 전처리를 하고 싶다.

- mnist, cifar-10 이런 것들 말고 내 자신의 데이터를 사용해 보고 싶다.

 

위와 같은 문제를 해결하기 위해 데이터 로더를 사용합니다.

# 사용 예시

imagenet_data = torchvision.datasets.ImageNet('path/to/imagenet_root/')
data_loader = torch.utils.data.DataLoader(imagenet_data,
                                          batch_size=4,
                                          shuffle=True,
                                          num_workers=args.nThreads)

torchvision

여기서 잠깐, torchvision은 어떤 것일까?

PyTorch 공식문서에 따르면, torchvision은 유명한 데이터셋들, 모델 아키텍쳐 그리고 컴퓨터 비전을 위한 이미지 변형의 기능들을 담고 있는 패키지라고 합니다.

 

다음은 CIFAR10의 데이터를 가지고 dataloader를 사용하는 예제를 진행보겠습니다.

우선 필요한 패키지들을 Import 해줍니다.

transforms는 torchvision에서 제공하는 이미지를 선처리하기 위한 함수입니다. 여러개의 이미지를 Compose 내에 선처리할 내용들을 입력해서 이미지 처리를 진행합니다. 

 

1. ToTensor() : ToTensor는 Numpy 형태의 이미지 데이터를 Tensor형태로 바꿔주는 역할을 합니다.

또한 PIL Image나 numpy.ndarray등은 이미지가 (Height x Width x Channels) 형태로 되어있고 0~255의 값을 가지지만 torch.Float.Tensor 형태로 바꾸면서 (C x H x W) 순서와 0.0 부터 1.0사이의 값들로 변환해 줍니다.

 

2. Normalize() : Normalize는 이미지들을 표준화해주는 기능을 합니다.

 

다음으로 trainset은 CIFAR10이라는 데이터에서 train 데이터를 가지고 옵니다. 그리고 지정해두었던 transform을 적용하여 이미지들을 처리하여 가져옵니다.

마찬가지로 testset 또한 CIFAR10의 test데이터를 가져오고 transform을 적용해줍니다.

이제 trainloader와 testloader에다가 trainset과 testset을 DataLoader로 감싸서 선언을 해준 모습입니다.

이미지 가져다가 쓸 때, 학습을 시키기 위해 정해주어야 하는 것이 배치 사이즈입니다. 여기서도 batch_size 파라미터를 통해 8로 지정해주었습니다. batch_size가 8이면 8 x 3 x 32 x 32 형태로 배치가 형성이 됩니다. shuffle은 배치 안에서 순서를 랜덤하게 섞을 것인가 말것인가에 대한 파라미터입니다. num_workers는 batch size가 커지면 이미지를 가지고 오는 연산자체가 길어지게 됩니다. 이미지를 가지고 오는 것은 CPU가 처리를 하기 때문에 CPU를 코어를 몇 개를 사용하는가에 따라 연산 속도가 달라지게 됩니다. 배치 사이즈가 커질 수록 num_workers를 높게 설정하는 것이 좋습니다.

 

CIFAR10에서 사용하는 10가지 분류 클래스들을 지정해주었습니다.

 

다음은 tensor를 다시 numpy로 변환하여 이미지를 시각화하는 함수입니다.

# ToTensor HxWxC -> CxHxW
plt.imshow(np.transpose(np_img, (1,2,0)))

앞서서 이미지를 HxWxC 높이 너비 채널 순서의 텐서로 변환 해주었기 때문에 다시 시각화를 하기 위해서는 C(0)xH(1)xW(2) 형태로 바꿔줍니다.

DataLoader를 사용하여 만든 trainloader를 iter안에 넣어 image와 label을 차례대로 8개씩 확인 할 수 있습니다.

만들었던 imshow함수를 이용하여 어떤 데이터들이 있는지 한번 확인해보았습니다. 배치를 설정했던 것 처럼 8개 씩 이미지가 나오게 됩니다. 

 

본 포스트는 아래 콘텐츠를 학습하고 정리한 내용입니다. :
PyTorch로 시작하는 딥러닝, 비슈누 수브라마니안, 에이콘 출판사
김군이님 파이토치 강의(https://www.youtube.com/watch?v=KXiDzNai9tI&t=143s)

'PyTorch' 카테고리의 다른 글

[PyTorch] 5. Network의 정의  (0) 2020.02.12
[PyTorch] 4-1. 나만의 이미지 데이터셋 만들기  (22) 2020.02.11
[PyTorch] 3. nn & nn.functional  (0) 2020.01.22
[PyTorch] 2. Autograd & Variable  (0) 2020.01.18
[PyTorch] 1. 텐서(Tensor)  (0) 2020.01.11