선생님, 개발을 잘하고 싶어요.

tensorflow mnist 초급 본문

개발/tensorflow

tensorflow mnist 초급

알고싶은 승민 2018. 8. 20. 23:38

텐서플로 튜토리얼 한글 문서 : https://tensorflowkorea.gitbooks.io/tensorflow-kr/content/g3doc/tutorials/mnist/beginners/


소프트맥스 회귀

 1. 입력한 데이터가 각 클래스에 속한다는 증거를 수치적으로 계산

 2. 계산한 값을 확률로 변환


특정 클래스에 속하는지 계산

 1. 픽셀의 어두운 정도를 가중치 합(서로 다른 계수를 곱해 합하는 연산) 한다.

 - 가중치는 '해당 픽셀이 진하다는 것'이 '특정 클래스에 속한다는 것'애 반하는 내용이면 -의 값 / 맞다는 내용이면 +의 값

 2. 바이어스 (bias)라는 추가적인 항을 더해 준다.


 3. 위와 같은 증거값들을 '소프트맥스' 함수를 활용해 확률로 변환

 - 선형 함수를 원하는 형태로 변환하는 함수! (예의 경우 10가지 경우에 대한 확률분포로 변환)

 -> 각 클래스에 속할 확률로 변환하는 것


 소프트 맥스란? : http://neuralnetworksanddeeplearning.com/chap3.html#softmax


학습

 모델의 손실을 정의 (크로스 엔트로피 : http://colah.github.io/posts/2015-09-Visual-Information/)

 


샘플 코드 및 주석


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

import tensorflow as tf

# 상호작용하는 연산들을 심볼릭 변수를 활용해 기술
# 784차원의 벡터로 변형된 mnist 이미지의 데이터가 들어갈것
# None은 해당 차원의 길이가 어떤 길이든 가능하다.
# 즉 x는, 784차원 벡터인 이미지가 여러개 있는 자료형이라는것
x = tf.placeholder(tf.float32, [None, 784])

# 가중치 w 와 바이어스 b
# Variable은 수정 가능한 텐서
# 연산을 통해 사용되고, 수정된다.

# w [784, 10] 인 이유는 784차원 이미지 벡터를 곱해서 증거값을 나타내는 10차원 벡터를 얻고자 함
w = tf.Variable(tf.zeros([784, 10]))

# b [10] 인 이유는 위에서 만든 10차원 벡터에 더하기 위함
b = tf.Variable(tf.zeros([10]))

# 소프트맥스 : http://neuralnetworksanddeeplearning.com/chap3.html#softmax
y = tf.nn.softmax(tf.matmul(x, w) + b)

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

# 크로스 엔트로피 : http://colah.github.io/posts/2015-09-Visual-Information/
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

# 역 전파 알고리즘 : http://colah.github.io/posts/2015-08-Backprop/
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

# 작성한 변수들을 초기화
init = tf.global_variables_initializer()

sess = tf.Session()

# 실제 초기화
sess.run(init)

# 1000번! 학습
for i in range(1000):
    # 학습 데이터셋에서 무작위로 선택된 100개의 데이터로 구성된 배치를 가져온다.
    batch_xs, batch_ys = mnist.train.next_batch(100)
    # placeholder 자리에 데이터를 넣도록 데이터를 넘긴다.
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

# tf.argmax(y,1) : 우리 모델이 생각하기에 각 데이터에 적합하다고 판단하는 값 (예측값))
# tf.argmax(y_,1) : 실제 라벨

# 부울 값 리스트를 얻는다.
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}))


소프트맥스, 크로스 엔트로피, 역 전파 알고리즘 정리 필요성 존재!

Comments