코드부
import tensorflow as tf
# MNIST 데이터 다운로드
from tensorflow.examples.tutorials.mnist import input_data
#mnist = input_data.read_data_sets("/tmp/data/", one_hot=True) # one-hot 엔코딩으로 정답레이블 표시 - 방법 1 (원핫 표현 가능한 경우)
mnist = input_data.read_data_sets("/tmp/data/", one_hot=False) # one-hot 엔코딩 x - 방법2 (원핫 표현 불가능한 경우)
epoch = 1000
# 입력값과 출력값을 받기위한 플레이스홀더 정의
x = tf.placeholder(tf.float32, shape=[None, 784]) #28*28 = 784 784차원의 이미지, 임의의 입력 데이터 None
#y = tf.placeholder(tf.float32, shape=[None,10]) # (원핫을 표현 ) 0~9 까지 10개 레이블, 임의의 타겟 데이터 None - 방법 1
y = tf.placeholder(tf.int64, shape=[None]) # 0~9 까지 10개 레이블, 임의의 타겟 데이터 None - 방법 2
# 변수설정, 소프트맥스 회귀 모델 정의
W = tf.Variable(tf.zeros(shape=[784,10]))
b = tf.Variable(tf.zeros(shape=[10]))
logits = tf.matmul(x,W) + b
y_pred = tf.nn.softmax(logits)
# cross-entropy 를 정의하고 옵티마이저 설정
# loss = tf.reduce.mean(-tf.reduce_sum(y * tf.log(y_pred)
#loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits , labels=y)) # one-hot으로 표현된 경우 - 방법 1
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits , labels=y)) # - 방법 2
train_step = tf.train.GradientDescentOptimizer(learning_rate=0.5).minimize(loss)
#세션을 열고 변수 초기화
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# mini_betch를 이용해 100 개씩 학습 1000 번
for i in range (epoch):
batch_x , batch_y = mnist.train.next_batch(100)
cost,_ = sess.run([loss,train_step],feed_dict={x:batch_x, y:batch_y})
if i % 50 == 0:
print("step : {}\tloss : {}".format(i,cost))
# 모델의 정확도 출력
#correct_prediction = tf.equal(tf.argmax(y_pred,1),tf.argmax(y,1)) - # 방법 1 - 정답 y 레이블이 원핫 인코딩값
correct_prediction = tf.equal(tf.argmax(y_pred,1),y) # 방법 2 - 정답 y 레이블이 스칼라 값이므로 argmax 필요 x
# argmax - 출력값중 가장 높은값 출력 - 2번째 파라미터는 차원을 나타냄 0 을 열 , 1 은 행 , 2 는 행렬
acc = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print("정확도 : {}".format(sess.run(acc,feed_dict={x: mnist.test.images, y: mnist.test.labels})))
출력부
step : 0 loss : 2.3025853633880615
step : 50 loss : 0.40749335289001465
step : 100 loss : 0.3820759057998657
step : 150 loss : 0.3541696071624756
step : 200 loss : 0.4479416608810425
step : 250 loss : 0.3463912904262543
step : 300 loss : 0.20941297709941864
step : 350 loss : 0.400729775428772
step : 400 loss : 0.3737364113330841
step : 450 loss : 0.49058398604393005
step : 500 loss : 0.41620102524757385
step : 550 loss : 0.2729890048503876
step : 600 loss : 0.33347684144973755
step : 650 loss : 0.2736334502696991
step : 700 loss : 0.29564809799194336
step : 750 loss : 0.3730275332927704
step : 800 loss : 0.39759576320648193
step : 850 loss : 0.4126603603363037
step : 900 loss : 0.2376338243484497
step : 950 loss : 0.41531482338905334
정확도 : 0.920199990272522