labels_map = {
0: "T-Shirt",
1: "Trouser",
2: "Pullover",
3: "Dress",
4: "Coat",
5: "Sandal",
6: "Shirt",
7: "Sneaker",
8: "Bag",
9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
sample_idx = torch.randint(len(training_data), size=(1,)).item()
img, label = training_data[sample_idx]
figure.add_subplot(rows, cols, i)
plt.title(labels_map[label])
plt.axis("off")
plt.imshow(img.squeeze(), cmap="gray")
plt.show()
์๋์ผ๋ก Datasets์ ๋ฆฌ์คํธ ํ์์ผ๋ก ์ธ๋ฑ์ฑ ํ ์ ์๋ค.
import os
import pandas as pd
from torchvision.io import read_image
class CustomImageDataset(Dataset):
def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
self.img_labels = pd.read_csv(annotations_file)
self.img_dir = img_dir
self.transform = transform
self.target_transform = target_transform
def __len__(self):
return len(self.img_labels)
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
image = read_image(img_path)
label = self.img_labels.iloc[idx, 1]
if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
์ปค์คํ Dataset์ ๋ง๋ค๊ธฐ ์ํด์๋ init, len, getitem์ ๊ตฌํํ์ฌ์ผ ํ๋ค.
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)
# Display image and label.
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")
Dataset
์ ๋ฐ์ดํฐ์ ์ ํน์ง(feature)์ ๊ฐ์ ธ์ค๊ณ ํ๋์ ์ํ์ ์ ๋ต(label)์ ์ง์ ํ๋ ์ผ์ ํ ๋ฒ์ ์งํ
๋ชจ๋ธ์ ํ์ตํ ๋, ์ผ๋ฐ์ ์ผ๋ก ์ํ๋ค์ ใ๋ฏธ๋๋ฐฐ์น(minibatch)ใ๋ก ์ ๋ฌํ๊ณ , ๋งค ์ํญ(epoch)๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์์ด์ ๊ณผ์ ํฉ(overfit)์ ๋ง๊ณ ,Python์multiprocessing
์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ฒ์ ์๋๋ฅผ ๋์ธ๋ค.
DataLoader
๋ ์ด๋ฌํ ๋ณต์กํ ๊ณผ์ ์ ์์์ ์ฒ๋ฆฌํด์ค๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ํ์์๋ฐ๋ผ ์ํ๊ฐ ๊ฐ๋ฅํ๋ค. ๊ฐ ์ํ๋ง๋ค ํผ์ฒ์ ๋ ์ด๋ธ์ ํฌํจํ๋ ๋ฐฐ์น๋ฅผ ๋ฐํํ๋ค.
transform = ToTensor()
PIL ์ด๋ฏธ์ง๋ Numpy array๋ฅผ Tensor๋ก ๋ณํํ๋ค.
target_transform=Lambda(lambda y: torch.zeros(10, dtype=torch.float).scatter_(0, torch.tensor(y), value=1))
์ฌ์ฉ์ ์ ์ ๋๋คํจ์๋ฅผ ํ ๋น
import os
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
์ ๊ฒฝ๋ง์ ๋ฐ์ดํฐ์ ๋ํ ์ฐ์ฐ์ ์ํํ๋ ๊ณ์ธต(layer)/๋ชจ๋(module)๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
torch.nn
๋ค์์คํ์ด์ค๋ ์ ๊ฒฝ๋ง์ ๊ตฌ์ฑํ๋๋ฐ ํ์ํ ๋ชจ๋ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํฉ๋๋ค.
PyTorch์ ๋ชจ๋ ๋ชจ๋์nn.Module
์ ํ์ ํด๋์ค(subclass).
์ ๊ฒฝ๋ง์ ๋ค๋ฅธ ๋ชจ๋(๊ณ์ธต; layer)๋ก ๊ตฌ์ฑ๋ ๋ชจ๋์ด๋ค.
์ด๋ฌํ ์ค์ฒฉ๋ ๊ตฌ์กฐ๋ ๋ณต์กํ ์ํคํ ์ฒ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
device = (
"cuda"
if torch.cuda.is_available()
else "mps"
if torch.backends.mps.is_available()
else "cpu"
)
print(f"Using {device} device")
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNetwork().to(device)
print(model)
X = torch.rand(1, 28, 28, device=device)
logits = model(X)
pred_probab = nn.Softmax(dim=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")
Raw ์์ธก ๊ฐ๋ค์ softmax ํจ์๋ฅผ ํต๊ณผ์์ผ ์์ธก ํ๋ฅ ์ ๊ตฌํ๋ค. ์ง์ forward ํจ์๋ฅผ ํธ์ถํด์๋ ์๋๋ค
input_image = torch.rand(3,28,28)
print(input_image.size())
FashionMNIST ๋ชจ๋ธ์ ๊ณ์ธต์ ์ดํด๋ณด๊ธฐ ์ํด 28 * 28 ํฌ๊ธฐ์ ์ด๋ฏธ์ง 3๊ฐ๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์น๋ฅผ ๋ถ๋ฌ์จ๋ค.
flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.size())
28 * 28 ์ 2์ฐจ์ ์ด๋ฏธ์ง๋ฅผ 784์ ์ฐ์๋ ๋ฐฐ์ด๋ก ๋ณํ
layer1 = nn.Linear(in_features=28*28, out_features=20)
hidden1 = layer1(flat_image)
print(hidden1.size())
weight ์ bias๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ณํ ํ๋ ๋จ๊ณ
print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")
ReLU ์ ๊ฐ์ ๋น์ ํ activation ํจ์๋ฅผ ์ฌ์ฉํ์ฌ mapping์ ์งํ
seq_modules = nn.Sequential(
flatten,
layer1,
nn.ReLU(),
nn.Linear(20, 10)
)
input_image = torch.rand(3,28,28)
logits = seq_modules(input_image)
๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๋ฌ์์ผ์ฃผ๋ ๋ชจ๋์ ์ปจํ ์ด๋
softmax = nn.Softmax(dim=1)
pred_probab = softmax(logits)
Raw ๋ฐ์ดํฐ ๊ฐ์ [0, 1] ์ฌ์ด์ ๋ฒ์๋ก ๋ณํํ์ฌ ์ถ๋ ฅํด์ฃผ์ด ํ๋ฅ ์ฒ๋ผ ๋ง๋ ๋ค
print(f"Model structure: {model}\n\n")
for name, param in model.named_parameters():
print(f"Layer: {name} | Size: {param.size()} | Values : {param[:2]} \n")
์ ๊ฒฝ๋ง ๋ด๋ถ์ ๋ชจ๋ธ๋ค์ ์๋์ผ๋ก ํ๋ผ๋ฏธํฐํ ๋๊ณ ์ต์ ํ๋ weights ์ bias ์ ์ฐ๊ด๋๋ค.
์ด ํ๋ผ๋ฏธํฐ๋ค์ ์๋์ผ๋ก ์ถ์ ๋๋ฉฐ parameters ๋๋ named_parameters๋ก ์ถ์ ๊ฐ๋ฅํ๋ค.
์ถ์ฒ : PyTorch Tutorials https://tutorials.pytorch.kr/beginner/basics/data_tutorial.html
https://tutorials.pytorch.kr/beginner/basics/transforms_tutorial.html
https://tutorials.pytorch.kr/beginner/basics/buildmodel_tutorial.html
์์ฃผ ์ ์ฉํ ์ ๋ณด๋ค์!