본문 바로가기
  • Deep dive into Learning
  • Deep dive into Optimization
  • Deep dive into Deep Learning
Deep dive into Pytorch

Pytorch 2

by Sapiens_Nam 2023. 7. 11.
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor

오늘은 Dataset과 DataLoader에 대해 알아보자.

 

당연히 Neural network를 학습시킬 때 우리에게 중요한 건 데이터이다. 

파이토치에는 우리가 모델 학습에 많이 쓰는 다양한 데이터셋 (Image, Text, Audio etc) 이 저장되어져 있다.

그것을 보관하고 있는 모듈이 'Dataset' 모듈이다. 

예를 들어 Fashion-MNIST dataset을 사용하고 싶다면 다음과 같이 하면 된다.

 

참고로, Fashion-MNIST는 흑백 상/하의 사진 dataset으로 60,000장의 train 이미지와 10,000장의 Test image로 이뤄져 있다.

 

training_data = datasets.FashionMNIST(root = 'data', train = True, download = True, transform = ToTensor())
test_data = datasets.FashionMNIST(root = 'data', train = False, download = True, transform = ToTensor())

 

* root : 데이터가 저장될 path를 의미한다.

* train : True로 설정되면 train dataset이, False로 설정되면 Test dataset이 다운로드된다.

* download : 다운로드를 받을지 결정한다.

* transform : 데이터 전처리를 위한 변수로서, 현재는 데이터를 단순히 텐서 형태로 변환해주는 ToTensor 메소드만 호출하였다.

 

 

위 코드를 실행하면 Fashion-MNIST 데이터셋 다운로드가 진행될 것이다.

 

만약 위와 같이 파이토치에 내장된 벤치마크용 데이터셋이 아닌 자체적인 데이터셋 (custom dataset)을 사용하고 싶다면 다음과 같이 3개의 함수 (메소드)가 필요하다.

__init__(), __len__(), __getitem__()

 

1. __init__()

우리는 일반적으로 custom dataset을 클래스를 사용하여 정의할텐데, init 메소드 (생성자)가 필요하다.

 

2. __len__()

우리 데이터셋의 크기를 반환해주는 메소드이다.

 

3. __getitem__()

dataset에서 index를 기준으로 하여 sample을 반환해주는 메소드이다. 

 

자, Dataset을 활용해서 우리는 우리 데이터 sample과 label 하나씩을 얻을 것이다. 하지만 우리는 실제로 학습할 때, data sample 하나를 사용하지 않고 묶음 (mini-batch) 단위로 사용한다.

이를 해주는 것이 DataLoader이다.

DataLoader는 매 epoch마다 데이터를 셔플링해주고 데이터셋에서 데이터 index 검색을 python의 multiprocessing을 활용해 가속화하여 mini-batch 단위로 매 step마다 데이터를 반환해주는 역할을 한다.

 

from torch.utils.data import DataLoader

train_dataloader = DataLoader(training_data, batch_size = 64, shuffle = True)
test_dataloader = DataLoader(test_data, batch_size = 64, shuffle = True)

 

Dataset을 DataLoader 안에 호출줌으로써, 학습할 때 매 step마다 일정한 묶음의 데이터 샘플들을 반환할 수 있다.

여기서는 batch_size = 64로 설정했으므로 64장의 image sample과 label 묶음을 반환해줄 것이다.

shuffle = True로 설정한 것은 매 epoch을 시작하기 전에 데이터셋 전체를 한 번 랜덤하게 뒤섞어주기 위함이다.

이는 overfitting을 방지하는 것으로 알려져 있다.

 

 

마지막으로 Transforms에 대해서 조금 더 자세하게 살펴보자.

Data가 항상 딥러닝 알고리즘에 활용되기 적합한 상태로 존재하는 것은 아니다. 

우리는 이러한 Data를 딥러닝 알고리즘을 활용하여 학습하기에 적절한 상태로 변환 (transform)해주어야 한다.

파이토치에서 이러한 기능을 해주는 것이 torchvision.transforms이다.

 

가장 기본적인 ToTensor()는 PILImage나 ndarray 등의 데이터 샘플과 라벨의 dtype을 FloatTensor형태로 변환해주는 메소드이다. 

그 외에도 이미지 사이즈 조정, 픽셀값의 정규화 (평균, 표준편차 지정 가능) 등등 다양한 형태의 전처리가 존재하며 이것들은 그때그때 필요한 방식으로 활용해주면 된다.

 

다음 글에서는 이제 본격적으로 간단한 모델을 설계하는 코드에 대해 살펴보자.

 

728x90

'Deep dive into Pytorch' 카테고리의 다른 글

Pytorch 5 : Save and Load  (0) 2023.07.17
Pytorch 4 : Training  (1) 2023.07.16
Pytorch 3 : Neural network 구현  (0) 2023.07.15
Pytorch 1. Tensor  (0) 2023.07.06
Pytorch 첫 번째  (1) 2023.06.29

댓글