데이터셋의 특징을 가져오고, 하나의 샘플에 정답을 지정하는 일을 한 번에 처리합니다. 또 가져온 샘플들을 미니배치 로 전달하고, 에폭마다 데이터를 다시 섞어 과적합을 막습니다.
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과 연관지어 본다면,
...
dataset = Dataset(img_path, file, transform, target_transform)
dataloader = DataLoader(dataset, batch_size, shuffle)
변형을 통해 데이터를 조작하고 학습에 적합하게 만듭니다.
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
...
ds = datasets.FashionMNIST(
transform=ToTensor(),
target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)
transform=ToTensor() 과 target_transform=Lambda() 를 확인합니다.
ToTensor 는 PIL Image나 NumPy ndarray 를 FloatTensor 로 변환하고, 이미지의 픽셀의 크기(intensity) 값을 [0., 1.] 범위로 비례하여 조정(scale)합니다.
Lambda 변형은 사용자 정의 람다(lambda) 함수를 적용합니다.
여기에서는 정수를 원-핫으로 부호화된 텐서로 바꾸는 함수를 정의합니다. 이 함수는 먼저 (데이터셋 정답의 개수인) 크기 10짜리 영 텐서(zero tensor)를 만들고, scatter_ 를 호출하여 주어진 정답 y 에 해당하는 인덱스에 value=1 을 할당합니다.
코드로 우선 보여드리겠습니다.
import albumentations as A
...
transform = A.Compose(
[
A.SmallestMaxSize(max_size=160),
A.ShiftScaleRotate(shift_limit=0.05, scale_limit=0.05, rotate_limit=15, p=0.5),
A.RandomCrop(height=128, width=128),
A.RGBShift(r_shift_limit=15, g_shift_limit=15, b_shift_limit=15, p=0.5),
A.RandomBrightnessContrast(p=0.5),
A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
ToTensorV2(),
]
)
dataset = Dataset(csv_file, transform=transform)
A.Compose() 로 변경할 사항을 정의할 수 있습니다.
아주 유용한 정보네요!