EunGyeongKim

[NN] MNIST 분류 Neural Network 본문

ML & DL/딥러닝

[NN] MNIST 분류 Neural Network

EunGyeongKim 2022. 7. 22. 16:23

오늘은 MNIST 이미지를 이용하여 기본적인 neural network를 구성해 보았습니다. 

3개의 fully - connect 와 relu를 사용한 간단한 Nueral network 모델입니다.


data : MNIST 

데이터는 MNIST 데이터를 이용하여 학습하였습니다. 

MNIST 데이터는 28*28크기의 사진으로 0~9까지의 손글씨 데이터 입니다. 

import tensorflow as tf
import numpy as np
from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

상기 코드를 통해 MNIST 데이터를 불러올 수 있습니다.

 

아래는 이미지와 label을 확인해보는 코드입니다. 

import matplotlib.pyplot as plt
plt.figure(figsize = (40,40))

num_images = 10
for i in range(num_images) : 
  row = x_train[i]
  label = y_train[i]

  image = row.reshape(28,28)
  plt.subplot(1,num_images, i+1)
  plt.title(label, fontdict = {'fontsize':30})
  plt.axis('off')
  plt.imshow(image, cmap='gray')

데이터는 Data Loader를 이용하여 train_loader로 만들어 줍니다. 

Data loader는 데이터셋을 샘플러와 결합하고 주어진 데이터 세트에 대해 반복 가능하도록 해줍니다.

from torch.utils.data import DataLoader
train_loader = DataLoader(dataset=training_data, batch_size=64, shuffle=True)

 

그후 torch를 이용하여 모델구조를 만들어 줍니다. 

fc (=fully conenct)를 3번 진행합니다. 

fc1은 28*28크기(784개)를 256(16*16)으로

fc2은 16*16크기(256개)를 64(8*8)으로

fc3은 8*8크기(64개)를 10으로 줄여줍니다.

 

마지막으로 출력되는 10은 0,1,2,3,4,5,6,7,8,9 중 어떤 이미지인지 분류해주는 기능입니다.

import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784,256)
        self.fc2 = nn.Linear(256,64)
        self.fc3 = nn.Linear(64,10)
        self.relu = nn.ReLU()
        
    def forward(self, x):
        x = x.view(-1, 784)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        x = self.relu(x)
        x = self.fc3(x)
        # x = self.relu(x)
        
        return x
net = Net().to(device)

 

그다음 loss function을 설정해줍니다. 저는 CrossEntropy함수를 이용하였습니다. 

그 후 optimizer를 설정합니다 torch에서 제공하는 optimizer중 adam을 이용하였습니다.

학습률은 0.001로 설정하였습니다. 

loss_fuction = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr = 0.001)

 

그후 Neural Network를 학습시켜 줍니다.

for epoch in range(20):
    loss_val = 0
    for itr, data in enumerate(train_loader):
        
        optimizer.zero_grad()
        
        inputs, labels = data
        
        inputs = inputs.to(device)
        labels = labels.to(device)
                        
        pred = net(inputs)        
        loss = loss_fuction(pred, labels)
        
        loss.backward()
#         optimizer.zero_grad()
        optimizer.step()
        
        loss_val += loss.item()

    print("Loss: ", loss_val)

 

그 다음 test set을 예측하고 평가하는 부분입니다. 

 

input_test = test_data.data.float().to(device)
pred_test =net(input_test)
pred_category = torch.argmax(pred_test, dim = 1)

label_test = test_data.targets.to(device)

accu = torch.mean((pred_category == label_test).float())
print("Test accuracy:", accu)

 

결과를 실행 해보니 0.98%의 정확률이 나왔습니다.

 

 


깃허브 링크입니다.(https://github.com/EunGyeongKim/TIL/tree/main/2022/code)

 

 

Reference

[1] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. Advances in neural information processing systems, 25.

[2] https://medium.com/swlh/fully-connected-vs-convolutional-neural-networks-813ca7bc6ee5

 

 

'ML & DL > 딥러닝' 카테고리의 다른 글

머신러닝에 필요한 수학과 numpy코드  (0) 2023.02.20
그래프 그리기  (0) 2023.02.20
[데이터 전처리] 정규화 (Normalization)  (0) 2022.08.11
딥러닝 단어 정리  (0) 2022.07.23
[deep learning] early stopping  (0) 2022.02.06
Comments