[Pytorch] 제공된 데이터 불러오는 방법 (feat. CIFAR10)
Computer Vision/Pytorch

[Pytorch] 제공된 데이터 불러오는 방법 (feat. CIFAR10)

반응형

 

 

Pytorch에는 여러 데이터를 제공합니다. (mnist, cirfar... 등등)

그래서 파이토치에서 제공하는 데이터들을 불러와서 전처리하는 시퀀스가 어떻게 되는지에 대한 숲과 나무를 보는 포스팅을 하고자합니다.

 

여러 데이터들 중에서 CIFAR10을 불러오는 코드를 하나하나 분석하면서 실습 하겠습니다.

CIFAR10

현업에서는 이렇게 정제되어있는 데이터셋을 사용하지 않고 커스텀 데이터 셋을 사용하지만,

일련의 시퀀스를 경험한 뒤에 커스텀 데이터 셋을 load하고 변환시키는 것이 효율적인 학습 방법이라고 생각합니다.

 

 

전체코드

import torch
import torchvision
import torchvision.transforms as tr
from torch.utils.data import DataLoader, Dataset
import numpy as np


transf = tr.Compose([tr.Resize(8), tr.ToTensor()])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transf)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transf)

trainset[0][0].size()

trainloader = DataLoader(trainset, batch_size=50, shuffle=True, num_workers=2)
testloader = DataLoader(testset, batch_size=50, shuffle=True, num_workers=2)

len(trainloader) # train loader의 batch 데이터 개수 확인

dataiter = iter(trainloader) # trainloader안에 실제 값 확인
images, labels = dataiter.next() 
images.size()

 

 

 

 

 

필요한 라이브러리 Import하기

import torch
import torchvision
import torchvision.transforms as tr
from torch.utils.data import DataLoader, Dataset
import numpy as np

 

torchvision.transform이란?

데이터를 불러오면서 바로 전처리할 수 있게 해주는 라이브러리.

 

 

 

torch.utils.data에 DataLoader, Dataset란?

* DataLoader :

batch 기반의 딥러닝 모델 학습을 위해 Dataset를 batch 형태로 만들어주는 라이브러리.

Pytorch 공식 문서 : Dataset을 샘플에 쉽게 접근할 수 있게 순회 가능한 객체(iterable)로 감싸줌.

 

* Dataset :

데이터 튜닝할 때 사용.   (데이터 다운로드 및 변환 시켜줌)

Pytorch 공식 문서 : 샘플과 정답(label) 저장

 

 

 

 

 

 

Dataset 다운로드하기.

일단 코드 먼저 보면,

transf = tr.Compose([tr.Resize(8), tr.ToTensor()])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transf)
testset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transf)

''' output
Files already downloaded and verified
Files already downloaded and verified
'''

다운로드 중..

 

 

 

trainset과 testset 모두 마지막에 transform=transf .

transf는 tr.Compose를 받은 객체인데,

 

 

Compose란 무엇인가?

: 안에 있는 내용을 순차적으로 수행함.

위 코드 기준으로는 tf.Resize(8)을 먼저 수행한 뒤에 tr.ToTensor()를 수행함.

Resize의 8은 image size이며,

ToTensor는 pytorch에서 학습시킬 수 있도록 PIL 이미지*나 넘파이 배열을 Tensor로 변환시키는 함수입니다.

 

* PIL 이미지란?:

Numpy Array Image와 동일하게 Height x Width x Depth(=Channel) 순서로 이루어져 있는 이미지 형식.

Pixel value 범위는 0~255 사이이다.

 

Numpy Array Img, PIL img, Tensor img의 차이점을 더 깊게 알고 싶다면? (클릭)

 

 

 

추가적으로, 명심해야할 것은

Compose 안에 넣는 이미지들은 Only PIL Image.

PIL 이미지 형식만 Compose에서 쓸 수 있다는 점.

 

그래서 커스터마이징 데이터셋을 Compose를 통해 사용하려면

클래스와 함수들을 상속받아서 새로운 자식클래스를 선언하고 정의하여 사용하거나,

PIL 라이브러리를 import하여 이미지를 PIL로 load한 후에 Compose를 활용합니다.

 

 

본 편에서는 파이토치에서 제공되는(정제된) 데이터만 Load하고 전처리하는 과정만 보여드리겠습니다.

 

 

검증

우리가 학습할 trainset의 첫 번째 이미지가 어떤 size를 가지는지 한번 확인해보면

각각 값이 가지는 의미는, torch.Size([3, 8, 8]) = Channel, Hight, Width이며,

일반적인 이미지는 값의 순서가 8,8,3로 나옵니다. Hight,Width,Channel

 

Tip. OpenCV도 이미지를 Hight, Width, Channel 순서로 받아들이고 내보냅니다.

 

 

다음 trainset을 보고싶어서 인덱스를 변경시켜보면?

다음 인덱스에는 label이 담겨있기 때문에 속성이 일치하지 않다고 에러가 나게 됩니다.

Tip. label은 int로 저장되어있습니다.

 

 

 

 

 

DataLoad하기

trainloader = DataLoader(trainset, batch_size=50, shuffle=True, num_workers=2)
testloader = DataLoader(testset, batch_size=50, shuffle=True, num_workers=2)

len(trainloader) # CIFAR가 50000개인데, batch를 50으로 했으니까 50짜리 batch 1000개 나오는거다.

'''output
1000
'''

DataLoader안에 trainset, testset을 인스턴스로 넣고, 한번에 50개씩 묶음으로 섞어서 넣으며, cpu와 gpu를 번갈아가면서 스레드를 할당하겠다는 뜻.

 

DataLoader란?

 : Dataset을 batch 기반의 딥러닝 모델 학습을 위해 batch 형태로 만듦.

   실제로 우리가 학습할 때 이용할 수 있게 형태를 만들어 주는 기능.

 

batch_size란?

 : 데이터 50,000개를 한번에 넣지 않고 쪼개서 묶음으로 넣겠다는 뜻

 

 

trainloader안에 값을 실제로 보고싶다면?

iter, next 기억해라!!

dataiter = iter(trainloader)
images, labels = dataiter.next()

images.size() #[50, 3, 8, 8] = [batch_size, channel, hight, width]

'''output
torch.Size([50, 3, 8, 8])
'''

50개에 한 묶음씩 3채널로 8x8 size가 들어가있는 trainloader를 확인할 수 있다.

 

 

 

 

 

 

다음 포스팅에서는 

"같은 클래스안에 폴더 별 이미지 데이터를 이용하는 방법"에 대해 포스팅하겠다.

 

즉, 우리가 정리를 잘해놔서 폴더 안에 클래스별로 나눠 놓은 상황이라면?

./class/tiger

./class/lion

이런식으로 !!?

 

결론부터 말하자면

torchvision.datasets.ImageFolder를 사용해라!!!

 

끝.

 

 

 

 

 

 

 

반응형