Linear Algebra
💽

Dataset 불러오기

Pytorch에서 제공하는 Dataset, Dataloader를 이용하여 데이터셋을 불러오고 모델에 적용시킬 수 있도록 하는 것이 이번 포스팅의 목적이다.

데이터 로드를 위한 Class 만들기

custom dataset을 만들기 위해서는 class 형태로 만드는 것이 규칙처럼 되어있다. 이 class를 구성하는 함수에는 크게 3가지가 있다.
__init__(self)
data를 초기화하고 저장된 위치에서 불러오는 함수이다.
__getitem__(self, index)
특정 데이터에 접근하기 위해 사용하는 함수이다.
__len__(self)
dataset의 size를 알려주는 함수이다.
실제 코드를 보면서 확인해보자
import torch import torchvision from torch.utils.data import Dataset, DataLoader import numpy as np import math class WineDataset(Dataset): # 1) data 초기화 및 불러오기 def __init__(self): # delimiter = 구분요소 / skiprows = dataset이 아닌부분 무시 xy = np.loadtxt('./path/to/wine.csv', delimiter=',', dtype=np.float32, skiprows=1) self.n_samples = xy.shape[0] # class 와 features label을 구별하고 torch tensor 형태로 만들자 self.x_data = torch.from_numpy(xy[:, 1:]) # size [n_samples, n_features] self.y_data = torch.from_numpy(xy[:, [0]]) # size [n_samples, 1] # 2) 특정 데이터에 접근하는 함수 def __getitem__(self, index): return self.x_data[index], self.y_data[index] # 3) dataset의 길이 출력하는 함수 def __len__(self): return self.n_samples dataset = WineDataset() # Load whole dataset with DataLoader # shuffle: shuffle data, good for training # num_workers: faster loading with multiple subprocesses train_loader = DataLoader(dataset=dataset, batch_size=4, shuffle=True, num_workers=2) # Training Loop 돌리기 num_epochs = 2 total_samples = len(dataset) n_iterations = math.ceil(total_samples/4) #올림 연산 -> 자연수로 만듬 print(total_samples, n_iterations) #전체 data 개수 및 iteration 나타냄 for epoch in range(num_epochs): # enumerate() 함수는 인자로 넘어온 목록을 기준으로 인덱스와 원소를 # 차례대로 접근하게 해주는 반복자(iterator) 객체를 반환해주는 함수입니다. for i, (inputs, labels) in enumerate(train_loader): # here: 178 samples, batch_size = 4, n_iters=178/4=44.5 -> 45 iterations if (i+1) % 5 == 0: print(f'Epoch: {epoch+1}/{num_epochs}, Step {i+1}/{n_iterations}| Inputs {inputs.shape} | Labels {labels.shape}')
Python
복사