Tensorflow MNIST

Tensorflow로 구현된 MNIST에요.

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 예제를 참고했어요

댓글 없음:

댓글 쓰기

글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.

모든 댓글은 검토 후 게시됩니다.

Translate