MNIST는 텐서플로우에 기본으로 내장된 숫자 이미지 데이터입니다. 28x28 사이즈의 숫자가 0~1의 값으로 저장되어 있습니다. 이 데이터를 사용하여 소프트맥스 회귀(Softmax Regression) 방법으로 학습을 해보겠습니다.
소프트맥스 회귀는 로지스틱 회귀을 확장한 것입니다. 로지스틱은 두가지로만 구분이 가능하지만 소프트맥스는 n개로 분류할 수 있습니다. 아래 링크는 로지스틱 회귀에 대한 설명입니다.
http://cafe.naver.com/aidreaming/483
소프트맥스는 위의 그림을 보시면 아시겠지만 신경망의 단층 퍼셉트론과 거의 유사합니다. 딥러닝 CNN에서 마지막 단계가 fully-connected layer인데 보통 히든 레이어와 소프트맥스를 연결해서 구현하는 것 같습니다.
텐서플로우 코드는 아래와 같습니다.
---------------------------------------------------------------------
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
# MNIST 데이터를 해당 폴더에 다운받아 압축을 해제하고 변수에 저장
mnist = input_data.read_data_sets('mnist/input_data', one_hot=True)
# 입력값 플레이스홀더 설정
x = tf.placeholder(tf.float32, [None, 784])
# 가중치 변수
W = tf.Variable(tf.zeros([784, 10]))
# 편향값 변수
b = tf.Variable(tf.zeros([10]))
# 소프트맥스 설정
k = tf.matmul(x, W) + b
y = tf.nn.softmax(k)
# 이미지의 실제 숫자값 플레이스홀더 설정 (10개의 열은 각각 0~9 숫자를 나타냄)
y_ = tf.placeholder(tf.float32, [None, 10])
# 학습률 설정
learning_rate = 0.5
# 출력값 y와 실제 숫자값 y_ 사이의 크로스 엔트로피로 코스트 설정
# softmax_cross_entropy_with_logits()가 softmax()를 포함하기 때문에 y대신 k 입력
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(k, y_))
# 코스트가 낮게 되도록 경사 하강법 실행
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# 세션 초기화
print ("Training")
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
# 1000번씩, 전체 데이타에서 100개씩 뽑아서 트레이닝을 함.
for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
# 학습된 가중치와 편향값 출력
print('W is',sess.run(W))
print ('b is ',sess.run(b))
---------------------------------------------------------------------