일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Scienceplots
- n_neighbors
- 카카오
- n_sample
- 파이썬을파이썬답게
- PAPER
- Overleaf
- mMAPE
- 평가지표
- Pycaret
- SMAPE
- RMES
- 스택
- knn
- 에러해결
- 논문작성
- Alignments
- 프로그래머스
- 코테
- 논문
- Tire
- TypeError
- Mae
- mes
- python 갯수세기
- iNT
- MAPE
- 논문editor
- KAKAO
- Python
- Today
- Total
EunGyeongKim
[NN] MNIST 분류 Neural Network 본문
오늘은 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' 카테고리의 다른 글
[데이터 전처리] 정규화 (Normalization) (0) | 2022.08.11 |
---|---|
딥러닝 단어 정리 (0) | 2022.07.23 |
[pycaret] Knn 오류 (Expected n_neighbors <= n_samples,) (0) | 2022.04.22 |
[deep learning] early stopping (0) | 2022.02.06 |
[통계] 기초통계 (0) | 2022.02.05 |