티스토리 뷰

오늘은 유명한 Tensorflow 예제 'MNIST for beginner'를 해 보겠습니다.



이 예제는 28X28 Dotmatrix의 숫자 이미지를 학습시켜 그림을 보여주고 이게 숫자 몇인지 맞추는 것 입니다.


이미지의 각 Dot는 0~255까지의 숫자로 나뉘어 있고

0은 하얀색,255는 검정색을 나타내고 그 사이는 그 중간의 밝기가 됩니다.




실행 방법은 아래 링크에 자세히 나와있습니다.

https://www.tensorflow.org/tutorials/mnist/beginners/



일단 실행 코드는 아래와 같습니다.


from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)


import tensorflow as tf


x = tf.placeholder(tf.float32, [None, 784])

W = tf.Variable(tf.zeros([784, 10]))

b = tf.Variable(tf.zeros([10]))

y = tf.nn.softmax(tf.matmul(x, W) + b)


y_ = tf.placeholder(tf.float32, [None, 10])

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))


train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)


init = tf.global_variables_initializer()


sess = tf.Session()

sess.run(init)


for i in range(1000):

  batch_xs, batch_ys = mnist.train.next_batch(100)

  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})


correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

              

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))



실행 결과는 아래와 같습니다.


19줄로 학습을 시키고 결과까지 볼수 있으니 참 좋습니다.

게다가 정확도도 91.78%이고요


한 줄씩 따라가 보겠습니다.


from tensorflow.examples.tutorials.mnist import input_data

input_data module을 import 합니다.


mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

이 코드는 현재 코드가 실행되는 폴더에 MNIST_data 폴더를 생성하고 압축을 풀어 줍니다.

그리고 mnist 변수에 데이터를 저장합니다.



우리가 지금 학습 시키는 모델의 구조는 아래와 같습니다.

결과(Y)는 One Hot encoding으로

[1,0,0,0,0,0,0,0,0,0] 이면 0을 나타내고

[0,1,0,0,0,0,0,0,0,0] 이면 1을 나타내는 식 입니다.




x = tf.placeholder(tf.float32, [None, 784])

그림 숫자 X 그림의 Dot 숫자로 입력 데이터가 저장될 공간을 생성 해 줍니다. 

28*28 이어서 784의 공간이 필요하고

None으로 설정한 곳은 그림의 숫자가 아직 확정되지 않았기 때문 입니다.


W = tf.Variable(tf.zeros([784, 10]))

이 모델에서는 1층짜리 full connected layer를 사용하고 출력이 10개 이므로

input 하나마다 10개의 weight가 필요합니다.

그래서 Input숫자 X Output 숫자 의 배열이 Weight로 필요합니다.


b = tf.Variable(tf.zeros([10]))

Bias는 Output의 숫자 만큼만 필요하므로 10개가 필요합니다.


y = tf.nn.softmax(tf.matmul(x, W) + b)

y 는 출력으로 해당 Matrix의 행렬곱에 Bias를 더한 값을 Softmax 함수를 취한 결과 입니다.

input과 Weight 행렬곱 연산의 결과로

[1,784]*[784,10] =>[1,10] 의 행렬이 생기고

여기에 bias [1,10]을 더해줍니다.

그리고 이 결과에 Softmax를 취해 줍니다.


y_ = tf.placeholder(tf.float32, [None, 10])

y_ 는 가지고 있는 데이터의 출력 값이 들어가는 공간 입니다.

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
Cross_entropy는 학습이 얼마나 정확한지 판단하는 함수입니다.

Cross entropy 에 대한 내용은 머신러닝 관련 내용을 찾아보시면 됩니다.
모델에 따라 여러 종류의 Cross entropy 함수가 있습니다.

여기서는 y_ * tf.log(y) 함수를 사용했습니다.
tf.reduce_sum는 행렬의 값을 더해주는 것이고
tf.reduce_mean는 행렬의 값을 평균 내 주는 것 입니다.

출력이 정확한지를 Cross entropy 함수를 이용하여 계산하고
이렇게 계산된 10개의 정확도를 더하면 1개 이미지에 대한 정확도값이 됩니다.
여러개의 그림이 입력되므로 이것의 평균을 내서
학습시킨 모델의 정확도를 계산 하는 것 입니다.

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
경사하강법을 이용해서 Cross_entropy를 최소화 하는 방향으로 학습을 진행 합니다.
학습이 진행되는 속도는 0.5 입니다. 작을수록 유리하지만 속도가 느려집니다.
Tensorflow는 여러가지 optimize algorithm을 지원합니다.

init = tf.global_variables_initializer()
학습에 사용되는 전역변수들을 초기화합니다.

sess = tf.Session()

sess.run(init)

Session을 생성하고 이를 실행합니다.


for i in range(1000):

  batch_xs, batch_ys = mnist.train.next_batch(100)

  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

train data set에서 100개의 그림을 랜덤하게 가져와서 batch_xs에 이미지를, batch_ys 에 Label을 넣습니다.

그리고 Cross_entropy가 줄어드는 방향으로 학습시키는 것을

1000번 반복합니다.


correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

예측이 맞으면 true, 틀리면 false로 만들어내고


accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

이것을 평균내서 정확도를 측정합니다.


print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

현재까지 학습된 모델에 test 이미지를 넣어서 정확도를 측정합니다.
test 이미지는 우리가 학습 시킬 때 사용하지 않은 이미지 입니다.


코드를 정리해 보면 6가지 일을 했습니다.
1. 학습용 데이터를 불러옴
2. 네트워크를 연결
3. 정확도를 평가하는 함수 생성
4. 정확도 함수의 값을 최소화 하는 함수를 생성
5. 데이터를 입력하면서 정확도 함수값이 최소화 되도록 weight와 bias를 변경
6. 학습시킨 모델에 평가용 데이터를 입력하여 모델의 성능을 평가

이렇게 첫번째 Neural network 모델을 Tensorflow를 이용하여 만들어 봤습니다.



댓글
Total
Today
Yesterday
최근에 올라온 글
최근에 달린 댓글