NLP_자연언어처리, Colab

[NLP]MNIST 문자 인식

vhxpffltm 2019. 7. 22. 20:50
반응형

참고 및 출처

https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/mnist/beginners/

http://solarisailab.com/archives/303

 

 

MNIST란 28 * 28 크기의 0~9 사이의 숫자 이미지와 이에 해당하는 레이블로 구성된 데이터베이스다.

 

이것은 데이터의 양이 적당하고 문제 정의가 간단하여 입문용으로 자주 사용한다.

 

MNIST 이미지 X가 입력으로 들어오면 그 이미지가 무슨 숫자인지를 해석해서 Y로 출력해주는 기본적인 이미지 인식 프로그램이다.  

 

 

컴퓨터는 픽셀값으로 구성된 2차원 행렬만을 가지고 학습을 진행한다. 중요한 점은 숫자의 위치와 모양에 따른 변형이 컴퓨터가 인식을 제대로 못하게 하는 원인이 되어 결과를 이상하게 낼 수 있다.

 

이를 해결하기 위한 방법론을 살펴보고 실습코드를 살펴볼 것이다.

 

먼저 Softmax Regression기법이다. Sotfmax부터 살펴보자

 

Softmax는 Softargmax의 줄임말로 정말 간단하게 입력받은 값을 출력으로 0~1사이의 값으로 출력하는 것이다.

 

이것을 사용하는 이유는 더 높은 확률의 값은 더 높이고 낮은 확률의 값은 더 낮추기 위함이다.

 

Softmax Regression은 어떤 input x가 주어졌을때 그것이 class i일거라고 확신하는 정도를 evidence라 하고 이 evidence를 softmax 함수를 통해 프로그램이 y라고 예축할 확률로 바꾼다.

 

이것을 도식화 하면 아래와 같다.

 

 

위와 같이 도식화 할 수 있다. 마지막으로 학습의 평가가 필요하다. cross-entropy라고 들어봤을 수 있다. 엔트로피와 크로스-엔트로피에 대한 설명은 추후에 포스팅하겠다.

 

먼저 손실함수중 하나인 cross-entropy는 모델의 예측값이 실제 참값을 설명하는데 얼마나 비효율적인지 나타낸다. 즉, 낮을수록 좋다는 얘기이다. 

 

실습코드와 결과를 보자.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import random
import tensorflow as tf
# for more information about the mnist dataset
mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)
 
nb_classes = 10 # 10개의 라벨
 
'''
Tensorflow에서 예시로 제공해주는 Mnist예시 input data를 가져온후 Mnist_data를 읽어옴
one-hot = True로 인코딩형태로 가져올 수 있음  
(일종의 약속을 코드로 구현 - 단 하나의 숫자만 1로 표현한다고 해서 one-hot-encoding)
'''
 
# MNIST data image of shape 28 * 28 = 784
= tf.placeholder(tf.float32, [None, 784])
# 0 ~ 9 digit recognition = 10 classes
= tf.placeholder(tf.float32, [None, nb_classes])
 
= tf.Variable(tf.random_normal([784, nb_classes]))
= tf.Variable(tf.random_normal([nb_classes]))
 
'''
Mnist는 28 * 28 = 784개의 픽셀이기 떄문에 위와같이 X값 설정 Y는 결과를 보기위한 0~9 lable
'''
 
 
# Hypothesis (using softmax)
# 특정 숫자로 제한된 결과값을 도출하기 위해 Softmax사용
 
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.2).minimize(cost)
 
 
# Test Model
# Calculate Accuracy
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
 
# parameters
#train_data가 많기 떄문에 한번에 학습하면 메모리가 부족할 수 있으므로 batch로 덩어리 나눔
#epoch는 전체 데이터를 모두 학습한 횟수 : 전체 데이터 * 15
training_epochs = 15
batch_size = 100
 
with tf.Session() as sess:
    # Initialize Tensorflow Variables
    # Training cycle
    for epoch in range(training_epochs):
        avg_cost = 0
        total_batch = int(mnist.train.num_examples / batch_size)
 
        for i in range(total_batch):
            batch_xs, batch_ys = mnist.train.next_batch(batch_size)
            c, _ = sess.run([cost, optimizer], feed_dict={X: batch_xs, Y: batch_ys})
            avg_cost += c / total_batch
        print('Epoch: ''%04d' % (epoch + 1), 'Cost: ''{:.9f}'.format(avg_cost))
        #print(i, '번째 학습 데이터 정확도:', sess.run(accuracy, feed_dict={X: batch_xs, Y: batch_ys}))
    print('Accuracy: 'accuracy.eval(session=sess, feed_dict={X: mnist.test.images, Y: mnist.test.labels}))
    r = random.randint(0mnist.test.num_examples - 1)
    print('Label: 'sess.run(tf.argmax(mnist.test.labels[r:r + 1], 1)))
    print('Prediction: 'sess.run(tf.argmax(hypothesis, 1), feed_dict={X: mnist.test.images[r:r + 1]}))
 
plt.imshow(mnist.test.images[r:r + 1].reshape(2828), cmap='Greys', interpolation='nearest')
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 
 

 

 

실행 결과는 위와 같다. 코드에 약간의 주석을 달아놓았다. matplot 라이브러리를 이용하여 결과를 시각화하였다.

코드에서 import에 있는 라이브러리는 별도의 설치가 필요하다. MNIST데이터 역시 튜토리얼에서 제공하는 기본 데이터셋을 사용하였다.

 

코드에 대해 설명해야 할 부분이 많지만 이 부분들은 추후에 설명할 수 있다면 수정하겠다.

 

필자가 AI수업을 듣고 실습문제를 풀 떄, 이러한 설명없이 코드를 진행하였고 모르는 부분들은 모두 검색하고 자료를 찾아보며 조금씩 이해하였다. 그렇기에 AI를 진행하면서 통계에 필요한 여러 수식들과 정규화 및 옵티마이저, 정확도 등의 이론 내용들은 틈틈히 포스팅하면서 내용을 알아보면 좋을 것 같다. 

 

반응형

'NLP_자연언어처리, Colab' 카테고리의 다른 글

[Colab] Histogram 코드  (0) 2020.04.07
[NLP] Word2Vec : CBOW, Skip-gram  (0) 2019.08.30
[NLP]의사 결정 트리  (0) 2019.08.25
[NLP]합성곱 신경망_CNN : CIFAR-10  (0) 2019.08.05
[자연언어처리] 다층 퍼셉트론  (0) 2019.07.09