본문 바로가기

정보공유/개발&코딩

[TensorFlow 기초강좌] Neural Network (2/3)









[TensorFlow 기초강좌] Neural Network (2/3)

Neural Net 구성하고 학습하기



  [TensorFlow 기초강좌] Neural Network (1/3)에서 pandas를 이용하여 csv파일을 불러왔습니다. 이번에는 이 데이터를 이용하여 Neural Net을 구성해보고 이것을 이용하여 학습을 하는 과정까지 진행해보도록 하겠습니다.





  지금 구성하려고 하는 Neural Net은 아래와 같습니다. 입력 데이터는 2가지 종류이고 3개의 hidden layer를 거쳐 2개의 라벨형태의 결과를 얻습니다. 각 레이어의 노드들은 각각 4개, 5개, 4개 입니다. 물론 실용성으로 따지면 2가지의 데이터를 가지고 2개를 구분하기에는 상당히 비경제적인 구조입니다.하지만 하나의 구조를 만들어 두면 파라미터의 개수만 바꿔서 얼마든지 복잡한 Neural Network를 구성할 수 있습니다.










(1) csv 데이터


  우선 지난번에 사용했던 파일을 열어 print를 했던 부분은 지워주시고 csv 데이터를 가져온 것 까지만 남겨주세요.



import tensorflow as tf
import pandas as pd
input_data = pd.read_csv("./bear_data.csv", usecols = [0,1])

output_data = pd.read_csv("./bear_data.csv", usecols = [2,3])




(2) 레이어 구성


  그리고 아래에 저희가 원하는 만큼의 레이어를 구성하기 위한 파라미터 수를 지정해줍니다. 입력 데이터의 종류는 무게와 키 2가지이기 때문에 Num_feature는 2로 할당합니다. 그리고 레이어 1, 2, 3에 각각 4, 5, 4를 할당해주고 마지막 라벨데이터의 종류는 판다와 북극곰 2가지 이므로 Classes도 2로 지정해 줍니다. 그리고 Learning_rate 는 학습을 할 때 숫자를 바꿔가는 비율입니다. 여기서는 1.2정도로 지정하도록 하겠습니다. 적절한 Learning_rate를 찾기 위한 연구가 진행 중이지만 아직까지 모든 상황에서 적절히 적용되는 이론이 없기 때문에 축차적으로 입력해보는 방법을 많이 사용하고 있습니다.


Num_features = 2

Num_layer1 = 4
Num_layer2 = 5
Num_layer3 = 4

Classes = 2

Learning_rate = 1.2



  다음으로 레이어 구조를 만들어 보겠습니다.


  우선 x는 입력데이터가 거쳐갈 공간입니다. 특성의 개수는 알고 있지만 데이터는 정확히 모르는 경우가 많습니다. Tensorflow에서는 이런 경우 이 값을 지정하지 않아도 되도록 기능을 지원해주기 때문에 None으로 지정하겠습니다. y_ 는 저희가 이미 알고 있는 판다인지 북극곰인지를 0과 1로 표시해둔 데이터가 들어갈 공간입니다. 마찬가지로 데이터의 개수는 None으로 지정했습니다.



x = tf.placeholder(tf.float32, [None, Num_features])

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



  이제 각 레이어들의 파라미터가 들어갈 공간을 할당해 주겠습니다.


Weight_1 = tf.Variable(tf.zeros(shape=[Num_features, Num_layer1]), dtype=tf.float32, name = 'Weight_1')

Bias_1 = tf.Variable(tf.zeros(shape=[Num_layer1]), dtype=tf.float32, name = 'Bias_1')

Weight_2 = tf.Variable(tf.zeros(shape=[Num_layer1, Num_layer2]), dtype=tf.float32, name = 'Weight_2')

Bias_2 = tf.Variable(tf.zeros(shape=[Num_layer2]), dtype=tf.float32, name = 'Bias_2')


Weight_3 = tf.Variable(tf.zeros(shape=[Num_layer2, Num_layer3]), dtype=tf.float32, name = 'Weight_3')

Bias_3 = tf.Variable(tf.zeros(shape=[Num_layer3]), dtype=tf.float32, name = 'Bias_3')


Weight_out = tf.Variable(tf.zeros(shape=[Num_layer3, Classes]), dtype=tf.float32, name = 'Weight_out')

Bias_out = tf.Variable(tf.zeros(shape=[Classes]), dtype=tf.float32, name = 'Bias_out')


param_list = [Weight_1, Weight_2, Weight_3, Weight_out, Bias_1, Bias_2, Bias_3, Bias_out]

saver = tf.train.Saver(param_list)



  입력 데이터 2가지 각각에 4개의 weight(계수)가 곱해지고 bias(절편)가 더해지는 구조입니다. 따라서 그에 맞게 shape을 정해줍니다. 그리고 데이터의 형태는 float32로 정해줍니다.

  3편에서 학습한 데이터들을 이용하여 테스트를 하는 방법을 진행할 예정입니다. 이때 학습된 파라미터들을 불러오기 위해서는 여기서 name을 모두 입력을 해주어야 합니다.

layer_1 = tf.sigmoid(tf.matmul(x, Weight_1) + Bias_1)
layer_2 = tf.sigmoid(tf.matmul(layer_1, Weight_2) + Bias_2)
layer_3 = tf.sigmoid(tf.matmul(layer_2, Weight_3) + Bias_3)
out = tf.sigmoid(tf.matmul(layer_3, Weight_out) + Bias_out)

y = tf.nn.softmax(out)



  마지막으로 각 값들을 트레이닝에 비교하기 쉬운 값으로 바꾸기 위해 sigmoid와 softmax 함수를 이용합니다.







(3) 학습


  이렇게 키와 무게 두 가지 데이터를 3개층의 레이어를 거쳐 다시 2개의 값을 얻었습니다. 이렇게 얻은 값(y)과 알고 있던 값(y_)를 Cross Entropy라는 식을 이용해서 훈련을 하려고 합니다. 이 값을 아래에 적힌 식을 통해서 줄여야 하는 cost로 바꿔주고 Gradient Descent라는 트레이닝 기법에 줄여야 하는 값으로 넣어 줍니다.


cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices = [1]))

train_step = tf.train.GradientDescentOptimizer(Learning_rate).minimize(cross_entropy)



  이제 계산을 하기위해 세션을 열어주고 모든 변수들을 초기화 합니다.

init = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init)


  열어둔 세션을 이용하여 트레이닝을 시작합니다. 트레이닝은 총 20,000번 실시하고 1,000번 마다 cost값을 확인해보겠습니다. 20,000번 동안 cost가 약 0.53정도까지 내려가는 것을 확인할 수 있습니다.


for i in range(20000):
_, cost = sess.run([train_step, cross_entropy], feed_dict = {x: input_data, y_: output_data})
if i % 1000 == 0:
print "step : ", i
print "cost : ", cost
print "--------------"




(4) 정확도 확인


  마지막으로 학습한 결과를 라벨 데이터와 비교하여 정확도가 얼마나 되는지 확인해보겠습니다. 학습된 데이터에 의한 결과(y)와 갖고 있던 데이터(y_)를 비교하여 일치할 경우 1, 아닐 경우 0을 할당하여 평균을 내면 정확도를 확률 단위(0 = 0%, 1 = 100%)로 알 수 있습니다.


correct_prediction = tf.cast(tf.equal(tf.argmax(y,1), tf.argmax(y_,1)), tf.float32)


accuracy = tf.reduce_mean(correct_prediction)
sess.run(accuracy, feed_dict = {x: input_data, y_: output_data})




3편에서는 학습한 파라미터를 저장하여 임의의 데이터를 입력 받아 테스트를 해보겠습니다.




※ 작성된 자료는 TensorFlow 공식 홈페이지(https://www.tensorflow.org)의 내용을 참고하여 작성했습니다.


페이스북에 공유하기