์ ํ์์ ๊ฒฝ์ฐ ์ดํด๊ฐ ์ง๊ด์ ์ด๋ ๊ทธ๊ฒ๋ง์ ๊ฐ์ง๊ณ ๊ฐ์๊ธฐ CNN ๋ชจ๋ธ์ ๋์
ํ๋ฉด ๋จธ๋ฆฌ๊ฐ ๋ตํด์ง๋ ๊ฒฝํ์ ํ์ ์ด ์์๊ฒ์ด๋ค. ๊ทธ๋์ ์ค๋์ CNN ๊ธฐ๋ฐ ํ์ต ๊ณผ์ ์์ ์ญ์ ํ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์๋ณด๊ธฐ ์ํด ์ ๋ฆฌํ ๊ฒธ ๊ธ์ ์์ฑํ๋ค.
CNN ๊ธฐ๋ฐ ๋จธ์ ๋ฌ๋ ์์คํ ์ ํ์ต ๊ณผ์ ๊ณผ ์ญ์ ํ์ ์ดํด
๋จธ์ ๋ฌ๋ ์์คํ ์ ํ์ต ๊ณผ์ ์ ๋ฐ์ดํฐ ์ค๋น, ๋ชจ๋ธ ์ ์, ์์ ํ, ์์ค ๊ณ์ฐ, ์ญ์ ํ, ๊ทธ๋ฆฌ๊ณ ํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ด๋ฒ์๋ CNN(Convolutional Neural Network) ๋ชจ๋ธ์ ์ฌ์ฉํ๊ณ , Cross Entropy ์์ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ฐ ๋จ๊ณ๋ฅผ ์ดํด๋ณด๋๋ก ํ์.
1. ๋ฐ์ดํฐ ์ค๋น
CNN ๋ชจ๋ธ์ ์ฃผ๋ก ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ฏ๋ก, ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ ์ค๋นํด์ผ ํ๋ค. PyTorch์ torchvision ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
import torch
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
def prepare_data():
"""
CIFAR-10 ๋ฐ์ดํฐ์
์ ๋ก๋ํ๊ณ ์ ์ฒ๋ฆฌํ๋ ํจ์
reference: CIFAR-10 ๋ฐ์ดํฐ์
์ ๋ค์ด๋ก๋ํ๊ณ , ๋ฐ์ดํฐ ์ฆ๊ฐ ๋ฐ ์ ๊ทํ๋ฅผ ์ ์ฉํ๋ค.
return: train_loader, test_loader - ํ์ต ๋ฐ ํ
์คํธ ๋ฐ์ดํฐ ๋ก๋
"""
transform = transforms.Compose([
transforms.RandomHorizontalFlip(),
transforms.RandomCrop(32, padding=4),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)
return train_loader, test_loader
train_loader, test_loader = prepare_data()
์ด ์ฝ๋์์๋ CIFAR-10 ๋ฐ์ดํฐ์ ์ ์ฌ์ฉํ๋ค. ๋ฐ์ดํฐ ์ฆ๊ฐ ๊ธฐ๋ฒ(RandomHorizontalFlip, RandomCrop)๊ณผ ์ ๊ทํ๋ฅผ ์ ์ฉํ์ฌ ๋ชจ๋ธ์ ์ผ๋ฐํ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
2. CNN ๋ชจ๋ธ ์ ์
์ด์ CNN ๋ชจ๋ธ์ ์ ์ํด์ผ ํ๋ค. PyTorch์ nn.Module ํด๋์ค๋ฅผ ์์๋ฐ์ CNN ๋ชจ๋ธ์ ๊ตฌํํ ์ ์๋ค.
import torch.nn as nn
import torch.nn.functional as F
class CNN(nn.Module):
"""
CNN ๋ชจ๋ธ ํด๋์ค
reference: 3๊ฐ์ ์ปจ๋ณผ๋ฃจ์
์ธต๊ณผ 2๊ฐ์ ์์ ์ฐ๊ฒฐ์ธต์ผ๋ก ๊ตฌ์ฑ๋ CNN ๋ชจ๋ธ์ ์ ์ํ๋ค.
"""
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.conv3 = nn.Conv2d(64, 64, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 4 * 4, 512)
self.fc2 = nn.Linear(512, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = self.pool(F.relu(self.conv3(x)))
x = x.view(-1, 64 * 4 * 4)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
model = CNN().to(device)
์ด CNN ๋ชจ๋ธ์ 3๊ฐ์ ์ปจ๋ณผ๋ฃจ์ ์ธต๊ณผ 2๊ฐ์ ์์ ์ฐ๊ฒฐ์ธต์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ๊ฐ ์ปจ๋ณผ๋ฃจ์ ์ธต ๋ค์๋ ReLU ํ์ฑํ ํจ์์ Max Pooling์ด ์ ์ฉ๋๋ค.
3. ์์ ํ
์์ ํ ๊ณผ์ ์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ๋ชจ๋ธ์ ํต๊ณผ์์ผ ์์ธก๊ฐ์ ์ป๋ ๊ณผ์ ์ด๋ค. CNN ๋ชจ๋ธ์์๋ ์ด๋ฏธ์ง๊ฐ ์ปจ๋ณผ๋ฃจ์ ์ธต๊ณผ ํ๋ง ์ธต์ ๊ฑฐ์ณ ํน์ง์ ์ถ์ถํ๊ณ , ์ต์ข ์ ์ผ๋ก ์์ ์ฐ๊ฒฐ์ธต์ ํต๊ณผํ์ฌ ํด๋์ค ์์ธก๊ฐ์ ์ถ๋ ฅํ๋ค.
def forward_pass(model, inputs):
"""
์์ ํ ์ํ ํจ์
reference: CNN ๋ชจ๋ธ์ ์
๋ ฅ ์ด๋ฏธ์ง๋ฅผ ํต๊ณผ์์ผ ์์ธก๊ฐ์ ์ป๋๋ค.
argument: model - CNN ๋ชจ๋ธ, inputs - ์
๋ ฅ ์ด๋ฏธ์ง ๋ฐฐ์น
return: outputs - ๋ชจ๋ธ์ ์์ธก๊ฐ
"""
outputs = model(inputs)
return outputs
# ์์ ํ ์ํ ์์
inputs, _ = next(iter(train_loader))
inputs = inputs.to(device)
outputs = forward_pass(model, inputs)
์ด ์ฝ๋์์๋ forward_pass ํจ์๋ฅผ ์ ์ํ์ฌ CNN ๋ชจ๋ธ์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ ํต๊ณผ์ํค๊ณ ์์ธก๊ฐ์ ์ป๋๋ค. PyTorch๋ ์ด ๊ณผ์ ์์ ์๋์ผ๋ก ๊ณ์ฐ ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ค.
4. Cross Entropy ์์ค ๊ณ์ฐ
๋ถ๋ฅ ๋ฌธ์ ์์๋ ์ฃผ๋ก Cross Entropy ์์ค ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด ํจ์๋ ๋ชจ๋ธ์ ์์ธก ํ๋ฅ ๋ถํฌ์ ์ค์ ๋ ์ด๋ธ ๋ถํฌ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ธก์ ํ๋ค.
def compute_loss(outputs, targets, criterion):
"""
Cross Entropy ์์ค ๊ณ์ฐ ํจ์
reference: ๋ชจ๋ธ์ ์์ธก๊ฐ๊ณผ ์ค์ ๋ ์ด๋ธ ์ฌ์ด์ Cross Entropy ์์ค์ ๊ณ์ฐํ๋ค.
argument: outputs - ๋ชจ๋ธ์ ์์ธก๊ฐ, targets - ์ค์ ๋ ์ด๋ธ, criterion - ์์ค ํจ์
return: loss - ๊ณ์ฐ๋ ์์ค๊ฐ
"""
loss = criterion(outputs, targets)
return loss
# ์์ค ํจ์ ์ ์ ๋ฐ ์์ค ๊ณ์ฐ ์์
criterion = nn.CrossEntropyLoss()
_, targets = next(iter(train_loader))
targets = targets.to(device)
loss = compute_loss(outputs, targets, criterion)
์ฌ๊ธฐ์๋ nn.CrossEntropyLoss()๋ฅผ ์ฌ์ฉํ์ฌ ์์ค ํจ์๋ฅผ ์ ์ํ๋ค. ์ด ํจ์๋ ์ํํธ๋งฅ์ค ํจ์์ ์์ ๋ก๊ทธ ์ฐ๋ ์์ค์ ๊ฒฐํฉํ ํํ๋ก, ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์ ์ ํฉํ๋ค.
5. ์ญ์ ํ
์ญ์ ํ๋ ๊ณ์ฐ๋ ์์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ค์ ๋ํ ๊ทธ๋๋์ธํธ๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์ด๋ค. CNN ๋ชจ๋ธ์์๋ ์ปจ๋ณผ๋ฃจ์ ์ธต, ํ๋ง ์ธต, ์์ ์ฐ๊ฒฐ์ธต์ ๊ฐ์ค์น์ ํธํฅ์ ๋ํ ๊ทธ๋๋์ธํธ๊ฐ ๊ณ์ฐ๋๋ค.
์ญ์ ํ์ ์ํ์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค:
์ถ๋ ฅ์ธต์์์ ์ค์ฐจ: $$\delta^L = \nabla_a C \odot \sigma'(z^L)$$
์ฌ๊ธฐ์ $C$๋ ๋น์ฉ ํจ์, $a^L$์ ์ถ๋ ฅ์ธต์ ํ์ฑํ, $z^L$์ ์ถ๋ ฅ์ธต์ ๊ฐ์ค์น ํฉ, $\sigma$๋ ํ์ฑํ ํจ์์ด๋ค.์ด์ ์ธต์ผ๋ก์ ์ค์ฐจ ์ ํ: $$\delta^l = ((w^{l+1})^T \delta^{l+1}) \odot \sigma'(z^l)$$
์ฌ๊ธฐ์ $w^{l+1}$์ $l+1$ ์ธต์ ๊ฐ์ค์น ํ๋ ฌ์ด๋ค.๊ฐ์ค์น์ ํธํฅ์ ๋ํ ๊ทธ๋๋์ธํธ:
$$\frac{\partial C}{\partial w^l_{jk}} = a^{l-1}_k \delta^l_j$$
$$\frac{\partial C}{\partial b^l_j} = \delta^l_j$$
CNN์์๋ ์ด ๊ณผ์ ์ด ์ปจ๋ณผ๋ฃจ์ ์ฐ์ฐ์ ํน์ฑ์ ๊ณ ๋ คํ์ฌ ์์ ๋๋ค.
def backward_pass(loss):
"""
์ญ์ ํ ์ํ ํจ์
reference: ๊ณ์ฐ๋ ์์ค์ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ธ์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ๊ทธ๋๋์ธํธ๋ฅผ ๊ณ์ฐํ๋ค.
argument: loss - ๊ณ์ฐ๋ ์์ค๊ฐ
"""
loss.backward()
# ์ญ์ ํ ์ํ ์์
backward_pass(loss)
PyTorch์ autograd ์์ง์ loss.backward() ํธ์ถ์ ํตํด ์๋์ผ๋ก ๋ชจ๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ๊ทธ๋๋์ธํธ๋ฅผ ๊ณ์ฐํ๋ค. ์ด ๊ณผ์ ์์ ์ปจ๋ณผ๋ฃจ์ ์ธต์ ํํฐ์ ์์ ์ฐ๊ฒฐ์ธต์ ๊ฐ์ค์น, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ธต์ ํธํฅ์ ๋ํ ๊ทธ๋๋์ธํธ๊ฐ ๊ณ์ฐ๋๋ค.
6. ํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ
๋ง์ง๋ง์ผ๋ก, ๊ณ์ฐ๋ ๊ทธ๋๋์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ CNN ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. ์ด ๊ณผ์ ์ ์ตํฐ๋ง์ด์ ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋๋ค.
import torch.optim as optim
def update_parameters(model, optimizer):
"""
ํ๋ผ๋ฏธํฐ ์
๋ฐ์ดํธ ํจ์
reference: ๊ณ์ฐ๋ ๊ทธ๋๋์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ CNN ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ฐ์ดํธํ๋ค.
argument: model - CNN ๋ชจ๋ธ, optimizer - ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ
"""
optimizer.step()
optimizer.zero_grad()
# ์ตํฐ๋ง์ด์ ์ ์ ๋ฐ ํ๋ผ๋ฏธํฐ ์
๋ฐ์ดํธ ์์
optimizer = optim.Adam(model.parameters(), lr=0.001)
update_parameters(model, optimizer)
์ฌ๊ธฐ์๋ Adam ์ตํฐ๋ง์ด์ ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค. optimizer.step()์ ๊ณ์ฐ๋ ๊ทธ๋๋์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐ์ ํ๊ณ , optimizer.zero_grad()๋ ๋ค์ ๋ฐ๋ณต์ ์ํด ๊ทธ๋๋์ธํธ๋ฅผ ์ด๊ธฐํํ๋ค.
๊ฒฐ๋ก
์ด์์ผ๋ก CNN ๋ชจ๋ธ๊ณผ Cross Entropy ์์ค ํจ์๋ฅผ ์ฌ์ฉํ ๋จธ์ ๋ฌ๋ ์์คํ ์ ํ์ต ๊ณผ์ ๊ณผ ์ญ์ ํ์ ๋ํด ์ดํด๋ณด์๋ค. CNN์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ ๊ตฌ์กฐ๋ก, ์ปจ๋ณผ๋ฃจ์ ์ฐ์ฐ์ ํตํด ํจ๊ณผ์ ์ผ๋ก ํน์ง์ ์ถ์ถํ ์ ์๋ค. Cross Entropy ์์ค ํจ์๋ ๋ค์ค ํด๋์ค ๋ถ๋ฅ ๋ฌธ์ ์ ์ ํฉํ๋ฉฐ, ๋ชจ๋ธ์ ์์ธก๊ณผ ์ค์ ๋ ์ด๋ธ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ ์ธก์ ํ๋ค. ๊ฐ ๋จ๊ณ๋ฅผ ์ดํดํ๊ณ ์ ์ ํ ๊ตฌํํจ์ผ๋ก์จ ํจ๊ณผ์ ์ธ ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ๊ฐ๋ฐํ ์ ์๋ค.
'AI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
AI_basic ) ์ญ์ ํ(BackPropagation) (0) | 2024.11.06 |
---|---|
AI_Basic ) ์ ํํ๊ท ( Linear Regression ) ์ด๋ก ๋ถํฐ ๊ตฌํ ( OLS, ๊ฒฝ์ฌํ๊ฐ๋ฒ ) (1) | 2024.11.06 |
Learning Rate ( lr , ํ์ต๋ฅ ) (0) | 2020.10.29 |