dataset
- PyTorch에서 torch.utils.data.Dataset의 하위 클래스로 preloaded dataset을 제공
import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
training_data = datasets.FashionMNIST(
root="./data", #데이터 저장 경로
train=True, #True=train set, False=test set
download=True, #경로에 데이터가 없는 경우 인터넷에서 다운로드
transform=ToTensor() #data에 지정한 transform 수행
)
test_data = datasets.FashionMNIST(
root="data",
train=False,
download=True,
transform=ToTensor()
)
- TensorDataset()함수를 이용해 dataset 생성
from torch.utils.data import TensorDataset # 텐서데이터셋
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
dataset = TensorDataset(x_train, y_train)
dataset 정의하기
- 파일의 data를 통해 dataset 클래스를 만드는 과정.
: 추상클래스 torch.utils.data.Dataset를 Dataset에 상속받아서 함수들을 override한다.
class FaceLandmarksDataset(Dataset):
"""Face Landmarks dataset."""
def __init__(self, csv_file, root_dir, transform=None):
"""
Args:
csv_file (string): csv 파일의 경로
root_dir (string): 모든 이미지가 존재하는 디렉토리 경로
transform (callable, optional): 샘플에 적용될 Optional transform
"""
self.landmarks_frame = pd.read_csv(csv_file)
self.root_dir = root_dir
self.transform = transform
def __len__(self):
return len(self.landmarks_frame)
def __getitem__(self, idx):
if torch.is_tensor(idx):
idx = idx.tolist()
img_name = os.path.join(self.root_dir,
self.landmarks_frame.iloc[idx, 0])
image = io.imread(img_name)
landmarks = self.landmarks_frame.iloc[idx, 1:]
landmarks = np.array([landmarks])
landmarks = landmarks.astype('float').reshape(-1, 2)
sample = {'image': image, 'landmarks': landmarks}
if self.transform:
sample = self.transform(sample)
return sample
- init() : 파일 안의 data를 읽어 옴 _ 파일 경로와, 적용할 transform을 통해
- len() : 데이터셋의 크기 리턴 _ len(dataset) 때 호출
- getitem() : i번째 샘플을 찾는데 사용 _ dataset[i] 때 호출
- 학습에 적합한 형태로 data를 변형하여 모델에 넘기기 위한 과정
- ToTensor()
: ndarray를 FloatTensor로 변환, scaling
transform=ToTensor()
- 람다 transform
: 사용자 정의 람다함수 적용
target_transform = Lambda(lambda y: torch.zeros(
10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))
DataLoader
- 모델을 학습을 위해 전달 할 data sample의 minibatch의 batch_size를 설정하고, 매 epoch 마다 데이터를 섞어 overfitting을 방지하고, multiprocessing을 통해 데이터 검색 속도를 높이는 과정들을 추상화하여 제공하는 객체
- 생성한 dataset을 설정한 옵션에 맞게 batchsize로 슬라이싱하여 mini-batchs로 만들어준다.
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)