MNIST란 딥 러닝에서의 hello world나 마찬가지로, XOR구현과 함께 딥 러닝 계에서 제일 기본이 되는 프로그램입니다.
미국의 연구 기관 NIST에 의해 구성되고 제안되었으며, 2004년 이전부터 연구되어져 오던, 상당히 오래 된 토픽 중 하나이기도 해요.
참고 - https://en.wikipedia.org/wiki/MNIST_database
목적은 6만개의 hand writting 데이터를 0 - 9까지 구분하는 간단한 신경망을 구성하는 것이구요.
전체 코드는
# Tensorflow에서 MNIST데이터를 불러오는 기능 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot=True) #Tensorflow import import tensorflow as tf #interactive 선언, 계산 그래프와 실행을 분리(성능 이슈문제) sess = tf.InteractiveSession() # 변수 선언 파트 x = tf.placeholder(tf.float32, shape=[None, 784]) y_ = tf.placeholder(tf.float32, shape=[None, 10]) W = tf.Variable(tf.zeros([784,10])) b = tf.Variable(tf.zeros([10])) def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1) return tf.Variable(initial) def bias_variable(shape): initial = tf.constant(0.1, shape=shape) return tf.Variable(initial) # convolution 함수 선언, 1x1차원이며 depth를 증가시켜요. def conv2d(x, W): return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') # 2x2 max pooling(max 값을 다음 layer에 부여하는 신경망 구조 선언 def max_pool_2x2(x): return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') #1단계 신경망 선언 부분 - conv, max pool 로 구성되었어요. W_conv1 = weight_variable([5, 5, 1, 32]) b_conv1 = bias_variable([32]) x_image = tf.reshape(x, [-1,28,28,1]) h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) h_pool1 = max_pool_2x2(h_conv1) #2단계 신경망 선언 부분 - conv, max pool 로 구성되었어요. W_conv2 = weight_variable([5, 5, 32, 64]) b_conv2 = bias_variable([64]) h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) h_pool2 = max_pool_2x2(h_conv2) W_fc1 = weight_variable([7 * 7 * 64, 1024]) b_fc1 = bias_variable([1024]) h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) # dropout를 적용하는 부분. W_fc2 = weight_variable([1024, 10]) b_fc2 = bias_variable([10]) # 클래스 예측 및 비용 함수 y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2) # 비용 함수 - 여기서는 cross entropy가 사용되었어요. cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) # 모델 훈련 단계 train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1)) # 정확도 검증 함수 accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # 정확도 반환 함수 sess.run(tf.global_variables_initializer()) # sess.run은 tensorflow에서 실제 작동하는 부분입니다. tf.global_variables_initializer()는 변수 초기화 for i in range(30000): # 3만번 반복하세요 batch = mnist.train.next_batch(50) if i%100 == 0: train_accuracy = accuracy.eval(feed_dict={ x:batch[0], y_: batch[1], keep_prob: 1.0}) print("step %d, training accuracy %g"%(i, train_accuracy)) train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) print("test accuracy %g"%accuracy.eval(feed_dict={ # 정확도 출력 x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
여기서 entropy는 정보의 기댓값으로서 확률 분포의 무작위성을 설명하는 용도로 활용이 되는 것인데요. 오차율이 적을수록 정보의 양은 작아지게 되며 엔트로피도 감소해요.
cross-entropy 는 두 변수(network와 grount truth)간의 확률 분포의 차이를 나타내는 용도로 사용이 되었으며, 그 값이 작을수록 accuracy가 높아진다고 볼 수 있지요.
참고 링크는요.
entropy: https://ko.wikipedia.org/wiki/%EC%A0%95%EB%B3%B4_%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BC
cross-entropy : https://kakalabblog.wordpress.com/2017/04/04/cross-entropy-%EC%A0%95%EB%A6%AC/
또한 코드 구성 참조는...
https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/mnist/pros/
에 나와 있는 MNIST 예제를 참고했어요
댓글 없음:
댓글 쓰기
글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.
모든 댓글은 검토 후 게시됩니다.