코드부
import tensorflow as tf
#MNIST 데이터 다운로드
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/",one_hot=True)
# 학습에 사용될 변수들 설정
learning_rate = 0.001
num_epochs = 30
batch_size = 256
displa_step = 1
input_size = 784
hidden1_size = 256
hidden2_size = 256
output_size = 10
#입력값과 출력값을 받기 위한 플레이스 홀더 설정
x = tf.placeholder(tf.float32, shape = [None, input_size])
y = tf.placeholder(tf.float32, shape = [None, output_size])
ANN 모델에 사용될 각종 변수를 초기화 한다.
# ANN 모델 정의
def build_ANN(x):
W1 = tf.Variable(tf.random_normal(shape = [input_size, hidden1_size]))
b1 = tf.Variable(tf.random_normal(shape = [hidden1_size]))
H1_output = tf.nn.relu(tf.matmul(x,W1) + b1)
W2 = tf.Variable(tf.random_normal(shape = [hidden1_size, hidden2_size]))
b2 = tf.Variable(tf.random_normal(shape = [hidden2_size]))
H2_output = tf.nn.relu(tf.matmul(H1_output,W2) + b2)
w_output = tf.Variable(tf.random_normal(shape = [hidden2_size, output_size]))
b_output = tf.Variable(tf.random_normal(shape = [output_size]))
logits = tf.matmul(H2_output,w_output) + b_output
return logits
# ANN 모델 선언
predicted_value = build_ANN(x)
딥러닝의 개념은 여러 노드를 깊게 파고 드는 것이다.
따라서 weight 값과 bias 값을 여러층으로 ( 예제에서는 총 3층 ) 계산토록 한다.
이해하기 쉽게 하기 위하여..
weight 의 shape 값은 [입력값 , 출력값] 이라고 생각하자.. 그렇게 해야지만 이해가 된다
bias 의 shape값은 쉽게 생각하자. 각 노드를 이어주는 선으로 생각하면 이해가 잘될것이다. --> [ weight의 출력값 ]
Hypothesis 는 [ x * W + B ] 임을 기억!! ==> x 값에 대해 생각을 해 보았다.
결국 가설(hypothesis) 은 입력값 * W + b 인데.. 왜 각 층마다 이전 노드의 hypothesis를 곱하는 걸까..
이유야 간단하다.
초기 Hypothesis 는 x 값에 의해 계산되는것이 맞고,
이후의 노드들은 W1 , B1 에 의해 가설이 재생성된다.
따라서 이후 가설에 대해서는 이전 가설의 값에 의해 계산되는것이 당연하다.
위처럼 이해하고 모델을 구성한다면 다음과 같을것이다.
#손실함수와 옵티마이저 정의
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = predicted_value, labels = y))
train_step = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(loss)
손실함수를 정의, 역시나 Softmax 의 Cross entropy 를 사용하며,
인자로는 ( 가설 , labels ) 인데..
labels 는 쉽게 말해 분류될 갯수를 나타내는것 같다. 따라서 y 값이 들어가게 된다.
Optimizer 를 정의한다.
여태까지 예제에서는 optimizer 로 Gradient 알고리즘을 사용했는데 갑자기 Adam 알고리즘을 사용했다.
무슨 차이인지는 더 공부를 해 봐야 겠지만 책에 설명에 의하면
Gradient 알고리즘은 0에 도달하면 더이상 파라미터를 업데이트 하지 않기 때문에 다른 종류의 알고리즘을 사용한다고 설명되어 있다.
제일 많이 사용되는 Optimizer 가 Adam 과 Gradient 인것 같다.
optimizer 의 인자는 ( 학습률(러닝레이트) ) 이며, 이의 최소값을 찾는것이므로 .minimize(loss) 를 덧붙인다.
# 세션을 열러 변수 초기화후 그래프 실행
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(num_epochs):
average_loss = 0.
#전체배치 사이즈 불러오기
total_batch = int(mnist.train.num_examples/batch_size)
#모든 배치들에 대해서 최적화 수행
for i in range(total_batch):
batch_x, batch_y = mnist.train.next_batch(batch_size)
#옵티마이저를 시행하고, 파라미터 업데이트 수행
_, cost = sess.run([train_step,loss],feed_dict={x:batch_x, y:batch_y})
#평균 소실 측정
average_loss += cost / total_batch
# 지정된 epoch마다 학습결과 출력
if epoch % displa_step == 0:
print("Step : %d\tLoss : %f"%((epoch+1),average_loss))
#테스트 데이터를 이용해 학습모델의 정확도 출력
correct_prediction = tf.equal(tf.argmax(predicted_value,1),tf.argmax(y,1))
acc = tf.reduce_mean(tf.cast(correct_prediction,"float"))
print("정확도 : %f"%(acc.eval(feed_dict={x:mnist.test.images, y:mnist.test.labels})))
실질적으로 실행을 한다.
출력부
Step : 1 Loss : 242.606340
Step : 2 Loss : 60.441268
Step : 3 Loss : 40.113990
Step : 4 Loss : 29.587428
Step : 5 Loss : 23.835133
Step : 6 Loss : 18.871365
Step : 7 Loss : 14.436662
Step : 8 Loss : 12.715328
Step : 9 Loss : 10.469781
Step : 10 Loss : 8.280394
Step : 11 Loss : 6.889524
Step : 12 Loss : 5.830906
Step : 13 Loss : 4.759171
Step : 14 Loss : 4.020574
Step : 15 Loss : 3.047320
Step : 16 Loss : 2.572009
Step : 17 Loss : 2.120104
Step : 18 Loss : 1.746665
Step : 19 Loss : 1.404878
Step : 20 Loss : 1.175315
Step : 21 Loss : 0.874911
Step : 22 Loss : 0.636827
Step : 23 Loss : 0.526886
Step : 24 Loss : 0.428142
Step : 25 Loss : 0.361234
Step : 26 Loss : 0.304521
Step : 27 Loss : 0.272772
Step : 28 Loss : 0.211142
Step : 29 Loss : 0.216332
Step : 30 Loss : 0.179863
정확도 : 0.939800
94% 정확도가 출력되었다.
머신러닝 기법의 Softmax 방식에서는 정확도가 92% 였지만, 딥러닝을 적용후 94%의 정확도 까지 올라갔음을 확인할수 있다.
참고 : Softmax 의 정확도