MNIST 데이터 세트
실습코드: https://goo.gl/oXNkQ7
MNIST는 Modified National Institute of Standards and Technology database의 줄임말입니다.
인공신경망 실습의 print(Hello World) 라고 할 수 있는, 전형적인 예제에 사용되는 데이터 세트입니다.
Training 용으로 55000장의 이미지를,
Validation 용으로 5000장의 이미지를,
Test 용으로 10000장의 이미지를 담고 있습니다. 총합 70000장의 이미지입니다.
각각의 이미지는 가로 28픽셀, 세로 28픽셀의 정사각형 모양이며,
서로다른 손글씨 이미지를 담고 있습니다.
컴퓨터에 저장되는 이미지는 픽셀(pixel) 단위로 표현되는데,
예컨대 숫자 1은 다음과 같이 흰 부분은 0, 검은 부분은 1로 기록됩니다. 회색 부분은 0과 1 사이의 숫자가 되겠죠.
입력
0부터 9까지의 10가지 손글씨 이미지를 학습하도록 훈련(training)시킵니다.
55000장의 훈련 이미지 각각을 픽셀(pixel)단위로 읽어서 입력 레이어에 넣어주고,
이때 이미지 한 장이 가로 28픽셀, 세로 28픽셀이므로 이미지 한 장당 784픽셀의 정보량입니다.
출력
출력 부분은 다음과 같이 동작합니다.
출력 레이어를 구성하는 10개의 노드들(y_1부터 y_10)이 각각 0부터 9까지의 숫자를 의미하는데요.
y_1: 0
y_2: 1
y_3: 2
...
y_10: 9
55000장 각각이 어떤 그림인지를 표시한 라벨(label)을
원-핫 인코딩(one-hot encoding)방식으로 출력 레이어에 넣어줍니다.
숫자 0은 [1 0 0 0 0 0 0 0 0 0]
숫자 1은 [0 1 0 0 0 0 0 0 0 0]
숫자 2는 [0 0 1 0 0 0 0 0 0 0]
숫자 3은 [0 0 0 1 0 0 0 0 0 0]
이런 식으로 숫자를 표현 해줍니다.
아래 오른쪽 그림에서 검게 색칠된 것이 보이죠?
세로로 읽어서 첫 번째 열은 위에서 6번째 칸이 검으니까 숫자 5를 나타낸 것이고
두 번째 열은 위에서 첫번째 칸이 검으니까 숫자 0을 나타낸 것입니다.
이미지가 어떤 숫자인지 정답을 표시하는 것이므로,
출력 레이어에 들어가는 정답 레이블은, 입력 레이어에 들어가는 이미지와 1:1로 대응합니다.
신경망 구성
인풋 레이어는 784개(28 x 28)의 노드로 구성되어 있습니다.
입력 레이어(784개 노드)와 출력 레이어(10개 노드) 사이에 히든 레이어가 있을 것인데,
히든 레이어의 구성은 만드는 사람 마음입니다.
4층 5층 100층을 만들어도 됩니다.
그렇지만 3층만 만들어도 결과를 도출할 수 있는데 굳이 100층까지 심하게 만들 필요는 없겠지요?
신경망은 다음과 같이 구성됩니다.
784개의 x와 10개의 y를 가진 연립방정식 형태로,
W는 Weights(가중치)
b는 bias(편향)을 의미합니다.
비유를 들자면 y=ax+b 형태에서 기울기(a)를 Weight로, y절편(b)를 bias로 표현할 수 있습니다.
이 신경망의 목적은, x와 y가 주어졌을 때 x와 y쌍을 엮는데 적합한 기울기와 y절편을 '학습'하는 것입니다.
softmax는 결과를 확률처럼 총합이 1이 되는 모양으로 만들어주기 위한 함수입니다.
훈련(training)
히든 레이어의 중간 결과를 X-ray사진처럼 표현하면,
이렇게 숫자의 '특징(feature)'이 도드라지는 방향으로 훈련된다는 것을 볼 수 있습니다.
결과
학습을 하면, 출력 레이어의 10개 노드가 가진 값의 크기를 비교해 그중에 가장 높은 점수를 정답으로 인정합니다.
아래 그림에서는 6이 가장 높은 점수를 얻어서 녹색으로 표시했네요.
결과(코드)
실습코드를 실행해보면, 다음과 같은 결과를 볼 수 있습니다.
test 데이터 10000개의 test데이터 중 5966번째 데이터는 정답 라벨이 6 인데, 분류 결과도 6으로 맞추었네요.
실습코드: https://goo.gl/oXNkQ7