MNIST ๋ฐ์ดํฐ์ ์๊ธ์จ๋ก ์ ํ ์ซ์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฅํ๋ ๋ค์ค ๋ถ๋ฅ(Multiclass classification) ๋ฌธ์ ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ด๋ค. ์์ ํฌ์คํ "[Model] 01. ์ธ๊ณต์ ๊ฒฝ๋ง(Artificial Neural Network) ๊ตฌํ"๊ณผ ์ค๋ณต๋๋ ๋ด์ฉ์ ๋ํด ๋ค๋ฃจ์ง ์์ ๊ฒ์ด๋ค. ํ์ํ๋ฉด ๋ค์ ๋งํฌ๋ฅผ ํตํด ์ฐธ๊ณ ํ๋๋ก ํ์.
ํ์ดํ ์น๋ฅผ ์ด์ฉํ์ฌ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(Convolutional Neural Network)๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค. ๊ตฌํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ฐ์ดํฐ ์ ๋ ฅ ๋ฐ ํ์ธ
2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
3. ๋ชจ๋ธ ์ค์
4. ๋ฐ์ดํฐ ํ์ต ๋ฐ ๊ฒ์ฆ
1. ๋ฐ์ดํฐ ์ ๋ ฅ ๋ฐ ํ์ธ
In:
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.init as init
import torchvision.datasets as dset
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchsummary import summary
import matplotlib.pyplot as plt
train = dset.MNIST('./', train = True, transform = transforms.ToTensor(), target_transform = None, download = True)
test = dset.MNIST('./', train = False, transform = transforms.ToTensor(), target_transform = None, download = True)
โท dset.MNIST()๋ฅผ ์ด์ฉํ์ฌ MNIST ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์๋ค. "./"๋ ํ์ฌ ์ฝ๋๊ฐ ์๋ ์์น๋ฅผ ๊ฒฝ๋ก๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ์ด๊ณ , transform ์ธ์์ transforms.ToTensor()๋ฅผ ์ฃผ์ด ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ดํ ์น์ ํ ์๋ก ๋ณํํ์๋ค. ๋ ์ด๋ธ์ ๋ํ ๋ณํ์ ํ์ง ์์๋ค. download ์ธ์๋ ํ์ฌ ๊ฒฝ๋ก์ MNIST ๋ฐ์ดํฐ๊ฐ ์ ์ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํ์๋ค.
In:
print(train)
print(test)
Out:
Dataset MNIST
Number of datapoints: 60000
Root location: ./
Split: Train
StandardTransform
Transform: ToTensor()
Dataset MNIST
Number of datapoints: 10000
Root location: ./
Split: Test
StandardTransform
Transform: ToTensor()
โท ํ๋ จ ๋ฐ์ดํฐ์ ์๋ 60,000๊ฐ ํ ์คํธ ๋ฐ์ดํฐ์ ์๋ 10,000๊ฐ์ด๊ณ , ๋ฐ์ดํฐ์ ํํ๊ฐ ํ ์๋ก ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
In:
train[1][0].shape
Out:
torch.Size([1, 28, 28])
โท ๊ฐ ๋ฐ์ดํฐ์ ํํ๋ฅผ ํ์ธํ ๊ฒฐ๊ณผ, ์ฑ๋์ ์๋ 1๊ฐ, ๊ฐ๋ก์ ์ธ๋ก์ ํฝ์ ์ ์๋ 28๊ฐ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
2. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
In:
batch_size = 256
ldr_train = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = True, num_workers = 2, drop_last = True)
ldr_test = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = True, num_workers = 2, drop_last = True)
โท ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ 256์ผ๋ก ์ค์ ํ๊ณ , ํ๋ จ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ์ ํ์ ์ ๋ฐ์ดํฐ ๋ก๋(Data loader)๋ก ๋ณํํ์๋ค.
โท num_workers ์ธ์๋ฅผ ํตํด ์ฌ์ฉํ ํ๋ก์ธ์ค์ ์๋ฅผ ์ค์ ํ๊ณ , drop_last ์ธ์๋ฅผ ํตํด ๋ง์ง๋ง์ผ๋ก ํ์ฑ๋ ๋ฐฐ์น๋ฅผ ํฌํจ์ํฌ์ง ๊ฒฐ์ ํ๋ค.
3. ๋ชจ๋ธ ์ค์
In:
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.layer = nn.Sequential(
nn.Conv2d(1, 16, 5),
nn.ReLU(),
nn.Conv2d(16, 32, 5),
nn.ReLU(),
nn.MaxPool2d(2, 2),
nn.Conv2d(32, 64, 5),
nn.ReLU(),
nn.MaxPool2d(2, 2)
)
self.fc_layer = nn.Sequential(
nn.Linear(64*3*3, 100),
nn.ReLU(),
nn.Linear(100, 10)
)
def forward(self, x):
out = self.layer(x)
out = out.view(batch_size, -1)
out = self.fc_layer(out)
return out
โท nn.Convd2()๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฅ๋ฐ๊ณ ์ถ๋ ฅํ๋ ์ฑ๋์ ์๋ฅผ ์ง์ ํ๊ณ , ํํฐ(Filter)์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ๋ ์ด์ด(Layer)์์๋ ์ ๋ ฅ ๋ฐ๋ ์ฑ๋์ ์๊ฐ 1์ด๊ณ , ์ถ๋ ฅํ๋ ์ฑ๋์ ์๋ 5๊ฐ, ํํฐ์ ํฌ๊ธฐ๋ 5×5์ด๋ค.
โท nn.MaxPool2d()์ ์ด์ฉํ์ฌ ๋งฅ์ค ํ๋ง(Max pooling)ํ ๋์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๊ณ , ๋ณดํญ(Stride)์ ์ ํ ์ ์๋ค. ๋ณดํญ์ ๋ํ ์ธ์๋ฅผ ์ฃผ์ง ์์ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ๊ฐ์ผ๋ก 1๋ก ์ค์ ๋๋ค.
โท ์์ CNN ๋ชจ๋ธ์ ํ์ฑํ ํจ์(Activation function)๋ก ReLU๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค. ์ธ ํฉ์ฑ๊ณฑ ๋ ์ด์ด(Convolutional layer)๋ฅผ ๊ฑฐ์น ๋ค์, ๋ ์ ํ ๋ ์ด์ด๋ฅผ ํตํด ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค. ์ด๋, ์ค๊ฐ์ ์ค๋ฒํผํ (Overfitting)์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋งฅ์ค ํ๋ง์ ์ฌ์ฉํ์๋ค.
In:
summary(nn.Sequential(
nn.Conv2d(1, 16, 5),
nn.ReLU(),
nn.Conv2d(16, 32, 5),
nn.ReLU(),
nn.MaxPool2d(2, 2),
nn.Conv2d(32, 64, 5),
nn.ReLU(),
nn.MaxPool2d(2, 2)
), (1, 28, 28))
summary(nn.Sequential(
nn.Linear(64*3*3, 100),
nn.ReLU(),
nn.Linear(100, 10)
), (1, 64*3*3))
Out:
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Conv2d-1 [-1, 16, 24, 24] 416
ReLU-2 [-1, 16, 24, 24] 0
Conv2d-3 [-1, 32, 20, 20] 12,832
ReLU-4 [-1, 32, 20, 20] 0
MaxPool2d-5 [-1, 32, 10, 10] 0
Conv2d-6 [-1, 64, 6, 6] 51,264
ReLU-7 [-1, 64, 6, 6] 0
MaxPool2d-8 [-1, 64, 3, 3] 0
================================================================
Total params: 64,512
Trainable params: 64,512
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.40
Params size (MB): 0.25
Estimated Total Size (MB): 0.65
----------------------------------------------------------------
----------------------------------------------------------------
Layer (type) Output Shape Param #
================================================================
Linear-1 [-1, 1, 100] 57,700
ReLU-2 [-1, 1, 100] 0
Linear-3 [-1, 1, 10] 1,010
================================================================
Total params: 58,710
Trainable params: 58,710
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.00
Params size (MB): 0.22
Estimated Total Size (MB): 0.23
----------------------------------------------------------------
โท summary()๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ์ธต์ ์ถ๋ ฅ ํํ์ ํ๋ผ๋ฏธํฐ์ ์๋ฅผ ํ์ธํ ์ ์๋ค.
โท ํฉ์ฑ๊ณฑ ๋ ์ด์ด์ ํ๋ผ๋ฏธํฐ์ ์๋ 64,512๊ฐ, ์์ ์ฐ๊ฒฐ ์ธต(Fully connnected layer)์ ํ๋ผ๋ฏธํฐ์ ์๋ 58,710๊ฐ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
4. ๋ฐ์ดํฐ ํ์ต ๋ฐ ๊ฒ์ฆ
Out:
Epoch: 1/10.. Training Loss: 0.771.. Test Loss: 0.212.. Test Accuracy: 0.937
Epoch: 2/10.. Training Loss: 0.168.. Test Loss: 0.125.. Test Accuracy: 0.962
Epoch: 3/10.. Training Loss: 0.112.. Test Loss: 0.079.. Test Accuracy: 0.976
Epoch: 4/10.. Training Loss: 0.087.. Test Loss: 0.073.. Test Accuracy: 0.977
Epoch: 5/10.. Training Loss: 0.072.. Test Loss: 0.054.. Test Accuracy: 0.983
Epoch: 6/10.. Training Loss: 0.061.. Test Loss: 0.053.. Test Accuracy: 0.984
Epoch: 7/10.. Training Loss: 0.054.. Test Loss: 0.046.. Test Accuracy: 0.985
Epoch: 8/10.. Training Loss: 0.048.. Test Loss: 0.044.. Test Accuracy: 0.987
Epoch: 9/10.. Training Loss: 0.044.. Test Loss: 0.039.. Test Accuracy: 0.987
Epoch: 10/10.. Training Loss: 0.041.. Test Loss: 0.036.. Test Accuracy: 0.988
In:
plt.plot(train_loss, label = 'Training loss')
plt.plot(test_loss, label = 'Test loss')
plt.xlabel('Epoch')
plt.ylabel('Cross Entropy Loss')
plt.legend(frameon = True)
Out:
โท ๋ง์ง๋ง ํ์ต์ ์งํํ ๋ค, ํ ์คํธ ๋ฐ์ดํฐ์์์ ์ ํ๋๊ฐ 98.8%๋ก ์๋นํ ํก์กฑํ ๋งํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์๋ค.
โท ๊ทธ๋ํ์ ํ์ต ์งํ๊ณผ์ ์ด ์๋นํ ๋ฐ๋์งํ๊ฒ ๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Reference:
์ต๊ฑดํธ, ใํ์ดํ ์น ์ฒซ๊ฑธ์ใ, ํ๋น๋ฏธ๋์ด(2019)
'Deep Learning > Model' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
LSTM(Long Short-Term Memories model) ๊ตฌํ (0) | 2020.10.10 |
---|---|
์ํ ์ ๊ฒฝ๋ง(Recurrent Neural Network) ๊ตฌํ (0) | 2020.10.01 |
์ธ๊ณต์ ๊ฒฝ๋ง(Artificial Neural Network) ๊ตฌํ (0) | 2020.07.29 |