[Tensorflow]17.MNIST 99.4%(END)


MNIST 99.4%



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

저번에는 98%의 정확도가 나왔는데 CNN을 적용하면 과연 더 올라갈까요???
시작해보겠습니다.

먼저, 맨 처음 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])
X_img=tf.reshape(X,[-1,28,28,1]) #3차원벡터로 바꾸어줍니다.
Y=tf.placeholder(tf.float32,[None,10])
keep_prob=tf.placeholder(tf.float32)#drop out에 사용되는 것입니다.



Convolution+pooling Layer 구축

#convolution+pooling layer 1
W1=tf.Variable(tf.random_normal([3,3,1,32],stddev=0.01))
L1=tf.nn.conv2d(X_img,W1,strides=[1,1,1,1],padding='SAME')
L1=tf.nn.relu(L1)
L1=tf.nn.max_pool(L1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
L1=tf.nn.dropout(L1,keep_prob=keep_prob)

#convolution+pooling layer 2
W2=tf.Variable(tf.random_normal([3,3,32,64],stddev=0.01))
L2=tf.nn.conv2d(L1,W2,strides=[1,1,1,1],padding='SAME')
L2=tf.nn.relu(L2)
L2=tf.nn.max_pool(L2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
L2=tf.nn.dropout(L2,keep_prob=keep_prob)

#convolution+pooling layer 3
W3=tf.Variable(tf.random_normal([3,3,64,128],stddev=0.01))
L3=tf.nn.conv2d(L2,W3,strides=[1,1,1,1],padding='SAME')
L3=tf.nn.relu(L3)
L3=tf.nn.max_pool(L3,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
L3=tf.nn.dropout(L3,keep_prob=keep_prob)



Fully connected Layer(분류기 단계)를 위해 reshape

L3=tf.reshape(L3,[-1,4*4*128])



Fully connected Layer(분류기 단계) 구축



#Fully connected layer 1
W4=tf.get_variable("W4",shape=[4*4*128,625],initializer=tf.contrib.layers.xavier_initializer())
b4=tf.Variable(tf.random_normal([625]))
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=[625,10],initializer=tf.contrib.layers.xavier_initializer())
b5=tf.Variable(tf.random_normal([10]))



hypothesis 정의

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



cost 함수 정의

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



cost 최소화

#AdamOptimizer를 이용하면 최솟값을 더 잘 찾을 수 있습니다~
optimizer=tf.train.AdamOptimizer(learning_rate=0.001)
train=optimizer.minimize(cost)



노드들을(tensor) 그래프 화

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



데이터가 많기에 역시 batch 시스템을 이용합니다~~!


저번 예제와 학습하는데 사용하는 코드는 똑같습니다.

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 값이 줄어드시는 것을 볼 수 있습니다.
학습하는데 층이 많다보니 시간이 정말 많이 걸립니다ㅠㅠ 45분이나 ㅠㅠ
이렇듯 데이터가 많고 층이 많을수록 정확해지는 대신에 시간이 오래걸려요
좋은 컴퓨터가 필요합니다 ㅋㅋㅋㅋㅋㅋㅋ

image



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

image


놀랍게도 정확도는 99.4%까지 나옵니다~~ 정말 대단합니다!



이렇게 여러분과 함께 tensorflow를 이용해서 머신러닝, Neural Network, CNN까지 배워봤는데요!

미래를 예측하고 싶은 우리 사회에 정말 없어서든 안 될 기술이라고 생각합니다!!


tensorflow 배우시는 걸 적극 추천합니다! ㅋㅋㅋㅋ

일단 tensorflow에 대한 포스팅은 여기까지하구요~~!

나중에 시간나면 RNN,tensorflow 용어 등 추가적으로 포스팅 할게요!!





지금까지 제 글을 봐주신 여러분께 감사드립니다~~~

전체 코드

image