코드부

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 의 정확도 

+ Recent posts