๋ฐ์ํ
โ ๏ธ ๋ณธ ๋ด์ฉ์ PyTorch Korea์ ๊ณต์ ๋ฌธ์์ ๊ธฐ๋ฐํ์ฌ ๊ณต๋ถํ ๋ด์ฉ์ ์ ์๊ฒ์ด๋ ์ํด๋ฐ๋๋๋ค!
Transform (๋ณํ)
๋ฐ์ดํฐ ๋ณํ(Transform)์ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ์ฆ๊ฐ(data augmentation)์ ์ํด ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๊ฐ ํญ์ ๋จธ์ ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ ํ์ต์ ํ์ํ ์ต์ข ์ฒ๋ฆฌ๊ฐ ๋ ํํ๋ก ์ ๊ณต๋์ง๋ ์์ต๋๋ค.
- ๋ณํ(transform) ์ ํด์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๊ณ ํ์ต์ ์ ํฉํ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ชจ๋ TorchVision ๋ฐ์ดํฐ์ ๋ค์ ๋ณํ ๋ก์ง์ ๊ฐ๋, ํธ์ถ ๊ฐ๋ฅํ ๊ฐ์ฒด(callable)๋ฅผ ๋ฐ๋ ๋งค๊ฐ๋ณ์ ๋๊ฐ (ํน์ง(feature)์ ๋ณ๊ฒฝํ๊ธฐ ์ํ transform ๊ณผ ์ ๋ต(label)์ ๋ณ๊ฒฝํ๊ธฐ ์ํ target_transform)๋ฅผ ๊ฐ์ต๋๋ค.
- torchvision.transforms ๋ชจ๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ๋ํ ๋ค์ํ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๋ณํ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ ์๋ก ๋ณํํ๊ฑฐ๋, ์ ๊ทํํ๊ฑฐ๋, ํ์ , ์๋ฅด๊ธฐ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์ด๋ฌํ ๋ณํ์ ๋ฐ์ดํฐ์ ์ ๋ก๋ํ ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
Example (Fashion-MNIST)
- FashionMNIST ํน์ง(feature)์ PIL Image ํ์์ด๋ฉฐ, ์ ๋ต(label)์ ์ ์(integer)์ ๋๋ค.
- ํ์ต์ ํ๋ ค๋ฉด ์ ๊ทํ(normalize)๋ ํ ์ ํํ์ ํน์ง(feature)๊ณผ ์-ํซ(one-hot)์ผ๋ก ๋ถํธํ(encode)๋ ํ ์ ํํ์ ์ ๋ต(label)์ด ํ์ํฉ๋๋ค.
- ์ด๋ฌํ ๋ณํ(transformation)์ ํ๊ธฐ ์ํด ToTensor์ Lambda๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ ๊น Fashing-MNIST ๋ฐ์ดํฐ์ ์ ๋ฐํ์ฌ ์ค๋ช ์ ํด๋ณด๋ฉด, 60,000๊ฐ์ ํ์ต ์ด๋ฏธ์ง์ 10,000๊ฐ์ ํ ์คํธ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
- ๊ฐ ์ด๋ฏธ์ง๋ 28x28 ํฌ๊ธฐ์ ํ๋ฐฑ(grayscale) ์ด๋ฏธ์ง์ด๋ฉฐ, 10๊ฐ์ ํด๋์ค๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
import torch
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda
# FashionMNIST ๋ฐ์ดํฐ์
๋ถ๋ฌ์ค๊ธฐ
ds = datasets.FashionMNIST(
root="data", # ๋ฐ์ดํฐ์
์ด ์ ์ฅ๋ ๊ฒฝ๋ก
train=True, # ํ์ต์ฉ ๋ฐ์ดํฐ์
์ ๋ถ๋ฌ์ต๋๋ค (train=False๋ก ์ค์ ํ๋ฉด ํ
์คํธ ๋ฐ์ดํฐ์
์ ๋ถ๋ฌ์ต๋๋ค)
download=True, # ๊ฒฝ๋ก์ ๋ฐ์ดํฐ์
์ด ์์ ๊ฒฝ์ฐ ์ธํฐ๋ท์์ ๋ค์ด๋ก๋ํฉ๋๋ค
transform=ToTensor(), # ์ด๋ฏธ์ง๋ฅผ ํ
์๋ก ๋ณํํฉ๋๋ค
target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1)) # ๋ ์ด๋ธ์ ์-ํซ ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํฉ๋๋ค
)
- FashionMNIST ๋ฐ์ดํฐ์ ์ ๋ถ๋ฌ์์ ์ด๋ฏธ์ง๋ฅผ ํ ์๋ก ๋ณํํ๊ณ , ๋ ์ด๋ธ์ ์-ํซ ์ธ์ฝ๋ฉ์ผ๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ์ ์ ์ค๋นํฉ๋๋ค.
- ์ด ๋ฐ์ดํฐ์ ์ ์ดํ ๋ชจ๋ธ ํ์ต์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- DataLoader๋ฅผ ํตํด ๋ฐฐ์น ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฉฐ, ๋ณํ๋ ์ด๋ฏธ์ง์ ๋ ์ด๋ธ์ ๋ชจ๋ธ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
ToTensor()
- ToTensor๋ PIL Image๋ NumPy ndarray ๋ฅผ FloatTensor๋ก ๋ณํํ๊ณ , ์ด๋ฏธ์ง์ ํฝ์ ์ ํฌ๊ธฐ(intensity) ๊ฐ์ [0., 1.] ๋ฒ์๋ก ๋น๋กํ์ฌ ์กฐ์ (scale)ํฉ๋๋ค.
- ๊ทธํ, (H, W) ํ์์ ์ด๋ฏธ์ง๋ฅผ (C, H, W) ํ์์ผ๋ก ๋ณํํฉ๋๋ค.
์ฌ๊ธฐ์ C, H, W๋ ๊ฐ๊ฐ ์ฑ๋(Channel), ๋์ด(Height), ๋๋น(Width)๋ฅผ ๋ํ๋ ๋๋ค.
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))
- ์ด ๋ณํ์ ๋ ์ด๋ธ์ ์-ํซ ์ธ์ฝ๋ฉ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
- ์-ํซ ์ธ์ฝ๋ฉ์ ํด๋์ค ๋ ์ด๋ธ์ ์ด์ง ๋ฒกํฐ๋ก ๋ณํํ์ฌ, ํด๋น ํด๋์ค์๋ง 1์ ํ ๋นํ๊ณ ๋๋จธ์ง ํด๋์ค์๋ 0์ ํ ๋นํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ณธ ๋ ์ด๋ธ์ด 3์ผ ๊ฒฝ์ฐ, ๋ณํ๋ ์-ํซ ์ธ์ฝ๋ฉ ๋ฒกํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์๋ณธ ๋ ์ด๋ธ: 3์-ํซ ์ธ์ฝ๋ฉ ๋ฒกํฐ: [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
One-Hot Encoding ๋ณํ ๊ณผ์
Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
- torch.zeros(10, dtype=torch.float): ๊ธธ์ด๊ฐ 10์ธ 0์ผ๋ก ์ฑ์์ง ํ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด๋ 10๊ฐ์ ํด๋์ค ๊ฐ๊ฐ์ ๋ํด ํ๋์ ์-ํซ ์ธ์ฝ๋ฉ ๋ฒกํฐ๋ฅผ ๋ํ๋ ๋๋ค.
- scatter_(0, torch.tensor(y), value=1): ์ธ๋ฑ์ค y์ ํด๋นํ๋ ์์น์ 1์ ์ค์ ํฉ๋๋ค.
- y๋ ์๋ณธ ๋ ์ด๋ธ์ด๋ฉฐ, ์ด๋ 0๋ถํฐ 9๊น์ง์ ๊ฐ์ ๊ฐ์ง๋๋ค.
๋ ์์ธํ ๋ด์ฉ์ ๋ณด๊ณ ์ถ์ผ์๋ฉด ์๋ ๋งํฌ์ ๋ค์ด๊ฐ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์!
- torchvision.transforms ๊ด๋ จ PyTorch ๊ณต์ ๋ฌธ์
๋ฐ์ํ
'๐ฅ PyTorch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PyTorch] ๋ชจ๋ธ ๋งค๊ฐ๋ณ์ ์ต์ ํ(Optimization) ํ๊ธฐ (0) | 2024.07.30 |
---|---|
[PyTorch] Torch.Autograd๋ฅผ ์ด์ฉํ ์๋ ๋ฏธ๋ถ (0) | 2024.07.30 |
[PyTorch] Neural Network Model (์ ๊ฒฝ๋ง ๋ชจ๋ธ) ๊ตฌ์ฑํ๊ธฐ (0) | 2024.07.26 |
[PyTorch] Dataset & DataLoader with CIFAR-10 (0) | 2024.07.26 |
[PyTorch] PyTorch Intro & Tensor (ํ ์) (0) | 2024.07.26 |