본문 바로가기

정보공유/개발&코딩

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









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

트레이닝 된 파라미터 저장하기, 저장한 파라미터 사용하기



  [TensorFlow 기초강좌] Neural Network (2/3)에서 Hidden layer가 3개 인 Neural Network를 구성하고 갖고있는 데이터를 통해서 트레이닝을 하였습니다. 그리고 트레이닝 한 데이터가 알고 있는 결과와 비교해서 정확도가 얼마나 되는지도 확인했습니다. 이번 강좌에서는 이렇게 트레이닝한 파라미터들을 저장하고 이 파라미터들을 불러서 사용하는 방법을 연습해보겠습니다.



  우선 practice4라는 파일을 만들어 지난번에 실습했던 코드를 똑같이 붙여넣겠습니다.


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])


Num_features = 2
Num_layer1 = 4
Num_layer2 = 5
Num_layer3 = 4
Classes = 2
Learning_rate = 1.2


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)




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)


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



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 "--------------"


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})







이제 아래에 코드를 추가하여여 파라미터를 저장하고 테스트를 해보겠습니다.


(1) 트레이닝 된 데이터 저장하기


  지난번 코드에서 작성했었던 파라미터 리스트와 tf.train.Saver 함수를 다시 확인해줍니다. 여기서 저장할 파라미터들을 지정하고 saver라는 것을 이 파라미터들을 저장하는 기능으로 지정해주었습니다. 이제 세션을 열어 이것을 save 해주시면 됩니다.



  트레이닝에 사용했던 for 문이 있는 곳을 찾아 for 함수가 끝난 직후에 트레이닝 된 파라미터들이 저장될 수 있도록 코드 한 줄을 추가해줍니다. 위에서 지정한 saver를 세션을 열어 저장하도록 하고 저장되는 위치를 현재 작업 중인 폴더로 지정했습니다. 파일 이름은 임의로 "trained_weight"라고 지정해주었고 확장자는 .ckpt로 해주셔야 합니다.



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 "--------------"
saver.save(sess, './trained_weight.ckpt')



(2) 저장된 파라미터 불러와서 테스트 해보기


  정확도까지 확인한 후 가장 마지막에 아래의 코드를 작성해줍니다. 리스트에 있던 북극곰과 판다의 데이터 중 임의로 2개씩을 가져왔습니다. 그리고 북극곰은 앞쪽을 1로 판다는 뒤쪽을 1로 라벨 데이터와 같이 지정해주었습니다.


  저장되었던 파라미터를 열려있는 세션을 이용하여 restore 했습니다.


  마지막으로 일치 여부를 true나 false로 표현해주는 equal이라는 함수를 이용하여 결과를 출력해보았습니다. 보시는 바와 같이 아래의 4개의 데이터는 모두 맞게 판단하였습니다.




input_data = [[250, 250], [300, 650], [132, 95], [134, 100]]
output_data = [[1, 0], [1, 0], [0, 1], [0, 1]]

saver.restore(sess, './trained_weight.ckpt')

decision = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
result = sess.run(decision, feed_dict = {x: input_data, y_: output_data})
print result



지금까지 Neural Net를 구성해보고 직접 훈련하여 활용하는 방법까지 살펴보았습니다. 다음 강좌에서는 이미지 처리에서 매우 높은 정확도를 보여주는 CNN을 실습해보겠습니다.




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


페이스북에 공유하기