Tensorflow - 모델 저장 및 재사용

실습 환경은 Python 3.6과 tensorflow 1.5이다.

 

현업에서는 딥러닝을 이용할 때 모델의 구성, 모델의 학습, 결과 예측을 각각 분리하여 처리해야 하는 경우가 많다(고 한다).

이러한 경우, Savercheckpoint 등을 이용해 모델에 관한 정보를 저장하고 불러와 사용하는 방식을 이용한다.

 

데이터 입력

앞선 예제들과 달리 데이터 역시 주로 프로그램의 내부가 아닌 외부에서 주어진다.

이러한 데이터를 불러오는 방법은 아래와 같다.

# 데이터 파일로부터 데이터 받아옴
data = np.loadtxt('./data.csv', delimiter=',',
                  unpack=True, dtype='float32')

# 슬라이싱을 통해 입력값과 출력값으로 분리
x_data = np.transpose(data[0:2])
y_data = np.transpose(data[2:])

csv 파일은 구분자로 데이터가 분리되어 입력된 파일을 말한다. 위 예제의 경우

[0, 1, 0, 0, 1]과 같은 구성으로, 앞의 두 요소가 입력값, 뒤의 세 요소가 출력값에 해당한다.

 

프로그램이 종료되고 재실행되어도 학습 횟수를 저장하기 위해 전역 변수 global_step을 선언한다.

global_step = tf.Variable(0, trainable=False, name='global_step')

 

신경망을 구성하고 손실, 최적화 값을 계산하는 과정은 생략한다. 이 내용이 궁금하면 다음 포스팅을 참고하라.

2020/07/15 - [개발 일지/ML] - Python Tensorflow로 인공신경망 구현하기

 

Python Tensorflow로 인공신경망 구현하기

실습 환경은 Python 3.6과 tensorflow 1.5이다. 인공 신경망(artificial neural network, ANN) 인공 신경망이란, 뇌내 신경 세포(뉴런)의 동작 원리에 기초한 학습 알고리즘이다. 학습의 목표는 원하는 출력값 y..

devpanpan.tistory.com

바로 학습으로 들어가자. 

sess = tf.Session()
saver = tf.train.Saver(tf.global_variables())

tf.global_variables()는 앞서 정의한 변수들을 반환하는 함수이다. 앞서 정의한 변수들은 saver라는 변수에 저장되어, 이후 Saver를 통해 파일 형태로 저장된다.

 

모델의 재사용 여지가 있는 경우, 학습 이전에 다음과 같은 분기문을 통해 이미 학습된 모델의 유무를 검사한다.

ckpt = tf.train.get_checkpoint_state('./model')
if ckpt and tf.train.checkpoint_exists(ckpt.model_checkpoint_path):
    saver.restore(sess, ckpt.model_checkpoint_path)
else:
    sess.run(tf.global_variables_initializer())

체크포인트(ckpt)에는 기존에 학습한 모델이 저장된다. 이게 존재한다면 restore(불러오기)를, 존재하지 않는다면 변수들의 초기화를 수행한다.

 

그리고 최적화(학습)을 실행한다.

for step in range(학습 횟수):
    sess.run(train_op, feed_dict={X: x_data, Y: y_data})
    
    print('Step: %d ' % sess.run(global_step),
          'Cost: %.3f '% sess.run(cost, feed_dict={X: x_data, Y: y_data}))

학습이 종료되면, 학습된 변수들은 체크포인트 파일에 저장한다.

saver.save(sess, './model/dnn.ckpt', global_step=global_step)

다음과 같이 설정하면, 프로그램을 종료해도 사용한 변수에 대한 정보가 파일로 저장되기 때문에 이후 프로그램을 재실행하면 변수 정보를 불러와 사용하게 된다.

예측값과 실제 결과, 정확도를 출력하는 출력문을 작성한 뒤 실행해보자.

prediction = tf.argmax(model, 1)
target = tf.argmax(Y, 1)
print("예측값: ", sess.run(prediction, feed_dict={X: x_data}))
print("실제값: ", sess.run(target, feed_dict={Y: y_data}))
is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print("정확도: ", sess.run(accuracy*100, feed_dict={X: x_data, Y: y_data}))

 

학습 횟수를 2 번으로 설정하고 학습을 실행하였다.

Step: 1 Cost: 0.989
Step: 2 Cost: 0.908
예측값: [0 2 2 0 0 2]
실제값: [0 1 2 0 0 2]
정확도: 83.33333

한 번 학습을 실행한 후, 프로그램을 종료하고 재시작한 뒤 학습을 실행하여도

Step: 3 Cost: 0.852
Step: 4 Cost: 0.806
예측값: [0 2 2 0 0 2]
실제값: [0 1 2 0 0 2]
정확도: 83.33333

학습이 이어서 진행됨을 확인할 수 있다.