[Tensorflow]14.MNIST 98%


14.MNIST 98%



이번 장에서는 MNIST예제를 neural network를 적용하여 작성해보겠습니다.

저번에 neural network를 사용하지 않았을 때는 91%의 정확도가 나왔는데 과연 어느정도 성능이 향상 될까요???
시작해보겠습니다.

먼저, 맨 처음 tensorflow를 import~~!

import tensorflow as tf



그리고 학습 데이터를 가져오기 위해 다음을 입력해줍니다

from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)



image



그러면은 위와 같이 tensorflow가 데이터를 알아서 가져와줍니다.

그 다음 학습에 필요한 변수들 선언!

X=tf.placeholder(tf.float32,[None,784])
Y=tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)#drop out에 사용되는 것입니다.



Layer 구축

#input layer
W1=tf.get_variable("W1",shape=[784,512],initializer=tf.contrib.layers.xavier_initializer())
b1=tf.Variable(tf.random_normal([512]))
L1=tf.nn.relu(tf.matmul(X,W1)+b1)
L1=tf.nn.dropout(L1,keep_prob=keep_prob)

#hidden layer1
W2=tf.get_variable("W2",shape=[512,512],initializer=tf.contrib.layers.xavier_initializer())
b2=tf.Variable(tf.random_normal([512]))
L2=tf.nn.relu(tf.matmul(L1,W2)+b2)
L2=tf.nn.dropout(L2,keep_prob=keep_prob)

#hidden layer2
W3=tf.get_variable("W3",shape=[512,512],initializer=tf.contrib.layers.xavier_initializer())
b3=tf.Variable(tf.random_normal([512]))
L3=tf.nn.relu(tf.matmul(L2,W3)+b3)
L3=tf.nn.dropout(L3,keep_prob=keep_prob)

#hidden layer3
W4=tf.get_variable("W4",shape=[512,512],initializer=tf.contrib.layers.xavier_initializer())
b4=tf.Variable(tf.random_normal([512]))
L4=tf.nn.relu(tf.matmul(L3,W4)+b4)
L4=tf.nn.dropout(L4,keep_prob=keep_prob)

#output layer
W5=tf.get_variable("W5",shape=[512,10],initializer=tf.contrib.layers.xavier_initializer())
b5=tf.Variable(tf.random_normal([10]))



hypothesis 정의

hypothesis=tf.matmul(L4,W5)+b5



cost 함수 정의

cost_i=tf.nn.softmax_cross_entropy_with_logits(logits=hypothesis,labels=Y)
cost=tf.reduce_mean(cost_i)



cost 최소화

#실제 값과 예측 값의 차이를 계속 줄여준다.
optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.1)
train=optimizer.minimize(cost)



노드들을(tensor) 그래프 화

sess=tf.Session()
#변수 초기화
sess.run(tf.global_variables_initializer())



데이터가 많기에 역시 batch 시스템을 이용합니다~~~!
저번 예제와 학습하는데 사용하는 코드는 똑같습니다.
다만 feed_dict 부분에 dropout에 이용되는 keep_prob이 추가됩니다~

training_epochs=15 #15번 거쳐서 학습을 시킨다
batch_size=100 #100개 씩 데이터를 가져온다
for epoch in range(training_epochs): 
   avg_cost=0 #학습 1번 당 평균 cost값
   #데이터의 총 갯수를 100으로 나누어준다. -> 몇 번에 거쳐 데이터를 가져올 지 계산
   total_batch=int(mnist.train.num_examples/batch_size) 
   for i in range(total_batch): #100개 씩 데이터를 가져와 학습시킨다.
       batch_xs,batch_ys=mnist.train.next_batch(batch_size) 
       c,_=sess.run([cost,train],feed_dict={X:batch_xs,Y:batch_ys,keep_prob=0.7})
       avg_cost+=c/total_batch
   print('Epoch:','%04d'%(epoch+1),'avg_cost','{:.9f}'.format(avg_cost))



학습 끝! 학습할 때마다 점점 cost 값이 줄어드시는 것을 볼 수 있습니다.
층이 많다보니 학습하는데 시간 좀 걸리네요ㅠㅠㅠ

image



과연 학습이 잘 되었나 확인해볼까요?
tensorflow에서 기본적으로 제공하는 test데이터를 이용해서 정확도를 측정해보겠습니다.

image


놀랍게도 정확도는 97.7%까지 나옵니다~~ 대단합니다!
딥러닝의 위대함을 다시 한번 느끼게 되네요~

다음 장에서는 Neural Network의 응용인 CNN에 대해 배워보겠습니다

전체 코드

image