data가 항상 ML 알고리즘 학습에 필요한 최종 처리가 된 형태로 제공되지 않는다
변형을 해서 데이터를 조작하고 학습에 적합하게 만든다.
모든 TorchVision dataset들은 변형 로직을 갖는
호출 가능한 객체(callable)를 받는 매개변수 두개를갖는다.
(특징을 변경하기 위한 transform과 정답을 변경하기 위한 target_transform)
torchvision.transforms 모듈은 주로 사용하는 몇가지 변형을 제공한다.
FashionMINIST 특징은 PIL Image 형식, 정답은 정수다.
학습을 하려면 정규화된 tensor 형태의 특징과 원-핫으로
부호화된 tensor 형태의 정답이 필요하다.
이러한 변형을 하기 위해 ToTensor와 Lambda를 사용한다.
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
ds = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor(),
target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
)
ToTensor는 PIL Image나 Numpy ndarray를 FloatTensor로 변환하고, 이미지 픽셀의크기 값을 [0., 1.] 범위로 비례하여 조정한다.
Lambda 변형은 사용자 정의 lambda 함수를 적용한다.
여기서 정수를 원-핫으로 부호화된 텐서로 바꾸는 함수를 정의한다.
이 함수는 먼저 (데이터셋 정답의 개수인) 크기 10짜리 0 tensor를 만들고
scatter_를 호출해 주어진 정답 y에 해당하는 인덱스에 value=1을 할당한다.
target_transform = Lambda(lambda y: torch.zeros(
10, dtype=torch.float).scatter_(dim=0, index=torch.tensor(y), value=1))