참고
Go to the end to download the full example code.
파이토치(PyTorch) 기본 익히기 || 빠른 시작 || 텐서(Tensor) || Dataset과 Dataloader || 변형(Transform) || 신경망 모델 구성하기 || Autograd || 최적화(Optimization) || 모델 저장하고 불러오기
변형(Transform)#
데이터가 항상 머신러닝 알고리즘 학습에 필요한 최종 처리가 된 형태로 제공되지는 않습니다. 변형(transform) 을 해서 데이터를 조작하고 학습에 적합하게 만듭니다.
모든 TorchVision 데이터셋들은 변형 로직을 갖는, 호출 가능한 객체(callable)를 받는 매개변수 두개
( 특징(feature)을 변경하기 위한 transform 과 정답(label)을 변경하기 위한 target_transform )를 갖습니다
torchvision.transforms 모듈은
주로 사용하는 몇가지 변형(transform)을 제공합니다.
FashionMNIST 특징(feature)은 PIL Image 형식이며, 정답(label)은 정수(integer)입니다.
학습을 하려면 정규화(normalize)된 텐서 형태의 특징(feature)과 원-핫(one-hot)으로 부호화(encode)된 텐서 형태의
정답(label)이 필요합니다. 이러한 변형(transformation)을 하기 위해 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))
)
0%| | 0.00/26.4M [00:00<?, ?B/s]
0%| | 32.8k/26.4M [00:00<03:30, 125kB/s]
0%| | 65.5k/26.4M [00:00<03:30, 125kB/s]
0%| | 131k/26.4M [00:00<02:24, 182kB/s]
1%| | 229k/26.4M [00:01<01:41, 258kB/s]
2%|▏ | 459k/26.4M [00:01<00:54, 481kB/s]
3%|▎ | 918k/26.4M [00:01<00:28, 911kB/s]
7%|▋ | 1.84M/26.4M [00:01<00:14, 1.75MB/s]
14%|█▍ | 3.67M/26.4M [00:02<00:06, 3.42MB/s]
24%|██▎ | 6.23M/26.4M [00:02<00:03, 5.13MB/s]
27%|██▋ | 7.14M/26.4M [00:02<00:04, 4.79MB/s]
37%|███▋ | 9.70M/26.4M [00:02<00:02, 6.03MB/s]
40%|███▉ | 10.5M/26.4M [00:03<00:02, 5.37MB/s]
52%|█████▏ | 13.8M/26.4M [00:03<00:01, 7.54MB/s]
57%|█████▋ | 15.2M/26.4M [00:03<00:01, 6.49MB/s]
61%|██████ | 16.0M/26.4M [00:03<00:01, 5.66MB/s]
72%|███████▏ | 19.1M/26.4M [00:04<00:00, 7.69MB/s]
75%|███████▌ | 19.9M/26.4M [00:04<00:01, 6.02MB/s]
84%|████████▍ | 22.2M/26.4M [00:04<00:00, 7.03MB/s]
87%|████████▋ | 23.1M/26.4M [00:05<00:00, 5.64MB/s]
94%|█████████▎| 24.7M/26.4M [00:05<00:00, 6.09MB/s]
98%|█████████▊| 25.8M/26.4M [00:05<00:00, 5.50MB/s]
100%|██████████| 26.4M/26.4M [00:05<00:00, 4.73MB/s]
0%| | 0.00/29.5k [00:00<?, ?B/s]
100%|██████████| 29.5k/29.5k [00:00<00:00, 113kB/s]
100%|██████████| 29.5k/29.5k [00:00<00:00, 113kB/s]
0%| | 0.00/4.42M [00:00<?, ?B/s]
1%| | 32.8k/4.42M [00:00<00:35, 124kB/s]
1%|▏ | 65.5k/4.42M [00:00<00:35, 124kB/s]
3%|▎ | 131k/4.42M [00:00<00:23, 181kB/s]
5%|▌ | 229k/4.42M [00:01<00:16, 257kB/s]
10%|█ | 459k/4.42M [00:01<00:08, 477kB/s]
21%|██ | 918k/4.42M [00:01<00:03, 906kB/s]
41%|████▏ | 1.84M/4.42M [00:01<00:01, 1.75MB/s]
83%|████████▎ | 3.67M/4.42M [00:02<00:00, 3.40MB/s]
100%|██████████| 4.42M/4.42M [00:02<00:00, 2.08MB/s]
0%| | 0.00/5.15k [00:00<?, ?B/s]
100%|██████████| 5.15k/5.15k [00:00<00:00, 24.0MB/s]
ToTensor()#
ToTensor
는 PIL Image나 NumPy ndarray 를 FloatTensor 로 변환하고, 이미지의 픽셀의 크기(intensity) 값을 [0., 1.] 범위로
비례하여 조정(scale)합니다.
Lambda 변형(Transform)#
Lambda 변형은 사용자 정의 람다(lambda) 함수를 적용합니다. 여기에서는 정수를 원-핫으로 부호화된 텐서로 바꾸는
함수를 정의합니다.
이 함수는 먼저 (데이터셋 정답의 개수인) 크기 10짜리 영 텐서(zero 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))
더 읽어보기#
Total running time of the script: (0 minutes 13.106 seconds)