MNIST 데이터셋을 활용한 손 글씨 숫자 인식 (패턴인식)


[References]

1. 이상구 with 이재화, [빅북] 인공지능을 위한 기초수학(Basic Mathematics for Artificial Intelligence), 교보문고 POD, 2019.

    http://matrix.skku.ac.kr/math4ai/


▪ 다음은 신경망을 활용하여 MNIST 데이터 세트의 손 글씨 숫자를 인식한 사례이다. 자료의 출처는 다음과 같다. 데이터 처리를 위한 코드는 Python/Sage로 새로 만들었다.

 [출처] THE MNIST DATABASE of handwritten digits http://yann.lecun.com/exdb/mnist/

         타리크라시드 지음, 송교석 옮김, 신경망 첫걸음, 한빛미디어, 2017년.

 

▪ 기계 학습의 성과를 벤치마크 하는데 가장 널리 사용되는 MNIST 데이터 세트는 60,000개의 학습 데이터와 10,000개의 테스트 데이터로 구성되어 있다.

각 데이터에는 손으로 쓴 0부터 9까지의 숫자의 이미지와 그 레이블(실제 숫자)이 담겨 있다. 데이터 세트의 각 이미지는 가로, 세로가

28픽셀(pixel)28 x 28 = 784개의 숫자를 갖는 벡터로 생각할 수 있으므로, 숫자를 인식하기 위한 신경망의 입력층은 784개의 노드,

출력층은 0부터 9까지의 숫자를 나타내는 10개의 노드로 구성된다. 은닉층(hidden layer)의 노드의 개수에 관하여 정해진 규정은 따로 없으나 이 절의 예시코드에서는 100로 하였다.

 

[Key point]

▪ 이제 어떤 숫자를 나타내는 이미지가 있다고 하자. 그러면 이것을 784 x 1의 벡터로 변환하여 신경망의 입력층에 전달한다. 그리고 신경망을 거쳐 얻은

출력층의 신호가 가장 큰 노드의 레이블로 숫자를 판단하게 된다. 예를 들어, 출력층의 신호가 가장 큰 노드의 레이블이 7이면 이를 숫자 7로 판단하게 된다.

▪ 아래는 https://github.com/freebz/Make-Your-Own-Neural-Network 에 공개된 Python 코드를 일부 수정하여 Sage에서 구현한 것이다.

예를 들어, MNIST 데이터세트로부터 숫자 7의 이미지를 읽어서 보여준다.

 

▪ 이제 주어진 학습 데이터를 활용하여, 신경망의 적절한 가중치를 얻은 후, 테스트 데이터를 이용하여 신경망의 성능을 판단해보자.

다음은 입력, 은닉, 출력 계층의 신경망으로, MNIST 데이터세트 일부를 학습시켜 테스트용 숫자 이미지를 잘 인식하는지 보여주는 코드이다.

학습 데이터 100개, 테스트 데이터 10개를 아래의 자료로부터 사용하였다.

[출처]

https://github.com/freebz/Make-Your-Own-Neural-Network

https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_train_100.csv

https://media.githubusercontent.com/media/freebz/Make-Your-Own-Neural-Network/master/mnist_dataset/mnist_test_10.csv

 

(아래 SageMathCell에 실습해보세요)

 

▪ 위의 결과로부터 학습 데이터 100, 테스트 데이터 10개를 사용했을 때, 신경망의 정확도는 70%임을 확인할 수 있다.

학습 데이터의 수를 늘리게 되면, 이보다 더 높은 정확도를 기대할 수 있는데, 실제로 여기 소개된 코드의 신경망을

60,000개의 학습 데이터에 의해 학습시키고, 10,000개의 테스트 데이터에 적용하면, (신경망의 가중치의 초기치가

임의로 주어지므로, 정확도의 수치가 일부 다를 수 있으나) 대략 95%의 정확도를 얻게 된다.

 

▪ MNIST 데이터 세트의 손 글씨 숫자를 인식한 사례는 신경망을 학습시키기 위한 데이터가 충분히 확보되었기에 가능했다.

이전에는 사용할 수 있는 데이터가 많지 않았으나, 오늘의 세계에서는 매일 (quintillion) 바이트의 데이터가 생성된다고 알려져 있다.

인공지능 시스템이 많은 량의 학습 데이터를 이용하여 특징을 파악하게 되면, 좀 더 나은 결과를 추론할 수 있을 것이다.

 

▪ MNIST 숫자 인식 사례와 마찬가지로, 음성 또는 신호를 인식하거나 문자를 인식하는 것도 유사한 방법으로 가능하다.

이보다 더 높은 수준의 분석이 요구되는 자연어 처리(Natural Language Processing, NLP)는 우리가 일상생활에서 사용하는

언어를 컴퓨터가 의미를 분석하여 처리하도록 하는 것으로, 단순히 음성 또는 문자를 인식하는 것 이외에 말하는 사람이 의미한 것,

필요한 것들을 추론을 해야 한다. 예를 들어, 사용자가 "피자 먹고 싶다!"라는 문장을 말했을 때, 인공지능 시스템은 음성의 파형으로부터

"피자 먹고 싶다!"라는 문장을 인식하는 것에서 더 나아가 사용자가 실제로 원하는 정보를 추론을 거쳐 파악하고 찾아서 제공해줘야 한다.

피자 예 ("피자 먹고 싶다!")에서 보면, 음식(food)으로 표기된 ‘피자’라는 용어의 사용에 주목하여, 말하는 사람이 피자를 만드는 방법을

알고 싶어 한다는 걸 암시하는 ‘조리법’과 같은 용어가 본문에 없음을 파악하고, 말하는 사람이 피자집을 찾고 있다고 판단할 수 있다.

이 경우 GPS 정보를 가지고 피자를 제공하는 식당을 찾아 근접성, 등급, 가격 순으로 순위를 매긴다. 만약 사용자가 이용한 피자 식당들의

기록이 있다면, 인공지능 시스템은 사용자가 자주 이용하는 식당 중 추천이 많은 가까운 곳을 찾아, 자연어 문장을 생성하여, 우리말로 다음과 같이 추천할 수도 있다.

 

               "여기서 2km 정도 떨어진 곳에 ***라는 피자집이 있습니다."

 

[참고 문헌]

Bitna Kim and Young Ho Park, Beginner’s guide to neural networks for the MNIST dataset using MATLAB, Korean J. Math. 26 (2018), No. 2, pp. 337-348.

Bitna Kim, Handwritten digits classification by neural networks with small data, Master thesis, Kangwon National University, 2018.

타리크라시드 지음, 송교석 옮김, 신경망 첫걸음, 한빛미디어, 2017년.

 

   

Copyright @ 2020 SKKU Matrix Lab. All rights reserved.
Made by Manager: Prof. Sang-Gu Lee and Dr. Jae Hwa Lee
*This research was supported by Basic Science Research Program through the National Research Foundation of Korea (NRF) funded by the Ministry of Education (2017R1D1A1B03035865).