인공지능/딥러닝

간단한 신경망으로 MNIST 정확도 99% 만들기

해피밀세트 2020. 5. 19. 00:30
반응형

 

 

 

MNIST 데이터란?

  • 인공지능 연구의 권위자 LeCun교수가 만든 데이터셋
  • 숫자 0~9까지의 손글씨 이미지의 집합이다.
  • 학습데이터 60,000개(확인용데이터 5000개), 테스트데이터 10,000개로 구성 되어 있다.
  • 사이즈는 28x28의 크기를 가진다. 이미지의 값은 0 또는 1이다 (흑,백)

 

 

MNIST 이미지

https://sdc-james.gitbook.io/onebook/4.-and/5.1./5.1.3.-mnist-dataset

 

  • 2차원 행렬에서 1차원으로 쭈욱 핀 형태로 784개의 열을 가진 1차원 행렬로 변환되어 저장이 되어 있다.
  • mnist.train.image : 784개의 열로 구성된 이미지가 55000개가 저장이 되어 있다.
  • mnist.train.image : 텐서플로우의 행렬을 나타내는 shape의 형태로는 shape=[55000,784] 이 된다.
  • mnist.test.image : 784개의 열로 구성된 숫자 이미지 데이타를 10000개를 가지고 있다.
  • mnist.test.image : 텐서플로우의 shape으로는 shape=[10000,784] 로 표현될 수 있다.

 

 

MNIST의 라벨

https://sdc-james.gitbook.io/onebook/4.-and/5.1./5.1.3.-mnist-dataset

 

  • Label 은 이미지가 나타내는 숫자가 어떤 숫자인지를 나타내는 라벨 데이터이다.
  • 10개의 숫자로 이루어진 1행 행렬이다.
  • 0~9 순서로, 그 숫자이면 1 아니면 0으로 표현된다.
  • 예) 1인경우는 [0,1,0,0,0,0,0,0,0,0,0] 9인 경우는 [0,0,0,0,0,0,0,0,0,1] 로 표현된다.
  • 이미지 데이터에 대한 라벨이기 때문에 이미지 데이터 수만큼 라벨을 가지게 된다.

 


 

Keras를 사용하여 MNIST 분류

 

1. 라이브러리 임포트

from __future__ import absolute_import, division, print_function, unicode_literals

!pip install -q tensorflow-gpu==2.0.0-rc1
import tensorflow as tf
from tensorflow.keras import datasets, layers, models

 

 

2. 데이터셋 다운로드

(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

 

 

3. 데이터셋 준비

train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

# 픽셀 값을 0~1 사이로 정규화
train_images, test_images = train_images / 255.0, test_images / 255.0

 

 

4. Keras로 신경망 구현 (3층)

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# 모델구조 확인
model.summary()

 

 

5. Dense층 추가하기

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

# 모델구조 확인
model.summary()

 

 

6. 모델 컴파일 및 훈련

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5)

 

 

7. 모델 평가

test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

 

 

8. 정확도 확인

print(test_acc)

반응형