05-04 00:07
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Artificial Intelligence / TensorFlow] R-TensorFlow 예제 - Graph Model & 변수 저장 및 복구하기 Part 1. 본문

Artificial Intelligence/TensorFlow

[Artificial Intelligence / TensorFlow] R-TensorFlow 예제 - Graph Model & 변수 저장 및 복구하기 Part 1.

cinema4dr12 2017. 8. 2. 15:26

Written by Geol Choi | Aug


TensorFlow를 이용한 학습을 통해 예측 모델을 생성한 후 추후 이 모델을 다시 사용하기 위해 결과를 저장할 필요가 있습니다. (저장하지 않는다면 매번 학습을 다시 해야하기 때문이죠! 이것은 분명 시간 낭비입니다.)


그래서 이번 포스팅에서는 학습이 완료된 결과 모델과 변수를 어떻게 저장하는지 그리고 저장된 결과를 어떻게 복구하는지 알아보는 시간을 갖도록 하겠습니다.


테스트 환경은 R이지만, Python도 (문법은 아주 약간 다르지만) 동일한 로직으로 동작하니 Python 문법으로 작성 시에도 참고하면 도움이 되리라 생각됩니다.

 사실 R에서의 TensorFlow는 Python-TensorFlow의 인터페이스에 불과합니다. 그럼에도 R을 사용하는 이유는, R에서 TensorFlow를 사용하는 분들에게 도움을 주기 위해서입니다 :)

모델 및 변수 저장하기

가장 먼저 해야 할 일은 무엇일까요?? 당근!! TensorFlow 라이브러리를 로딩하는 것입니다:


1
2
3
## tensorflow 라이브러리 임포트
if (! ("tensorflow" %in% rownames(installed.packages()))) { install.packages("tensorflow") }
require(tensorflow)
cs

 

이제 placeholdervariable을 정의합니다:


1
2
3
4
## placeholder와 variable 설정
w1 <- tensorflow::tf$placeholder(dtype="float32", name="w1")
w2 <- tensorflow::tf$placeholder(dtype="float32", name="w2")
b1 <- tensorflow::tf$Variable(2.0, name="bias")
cs


아시다시피, placeholder는 런타임에서 Graph Model에 공급해 줄 값들이며, variable은 TensorFlow가 내부적으로 변수로 취급하는 녀석들입니다. 가령, 학습을 하는 동안 최적화를 위해 TensorFlow가 지속적으로 업데이트 하는 대상들이죠.


특히 주목할 것은, 각 placeholder와 variable에 이름(name)이 주어져 있다는 것입니다. 이것은 나중에 이 값들을 복구할 때 이름으로 찾는데 일종의 key 역할을 하는 것입니다.


테스트 오퍼레이션, 즉 그래프 모델을 정의해 보겠습니다:


1
2
3
## 복구할 test operation 정의
w3 <- tensorflow::tf$add(w1, w2)
w4 <- tensorflow::tf$multiply(w3, b1, name="op_to_restore")
cs

 

w3는 단순히 w1w2를 더하는 오퍼레이션(연산)이며, w4는 앞서 계산한 w3b1을 곱하는 오퍼레이션인데 역시 name을 할당하였습니다. 마찬가지로 복구 시 이름으로 검색할 수 있도록 하기 위함입니다.


TensorFlow에서 늘 그렇듯 session 설정 및 초기화를 합니다:


1
2
3
## session 설정 및 변수 초기
sess <- tf$Session()
sess$run(tf$global_variables_initializer())
cs


그 다음 본 포스팅에서 가장 핵심이 되는 Saver 오브젝트를 생성합니다. Saver 오브젝트는 변수 저장을 위한 컨테이너(Container) 역할을 합니다.


1
2
## 변수 저장을 위한 Saver 오브젝트 생성
saver <- tf$train$Saver()
cs


오퍼레이션을 하나 실행해 볼까요? 반드시 필요한 과정은 아닙니다.


1
2
## operation 실행
sess$run(w4, feed_dict=dict(w1=5, w2=10))
cs


어떤 값이 나올까요? w4 그래프 모델에 w1과 w2로 값 5와 10을 각각 공급해 주었습니다.


w4 <- (w1 + w2) * b1 을 계산하는 것이니 결과는 30이 나올 것입니다:


> sess$run(w4, feed_dict=dict(w1=5, w2=10))
[1] 30


그래프 모델을 저장하기 전에, 현재 Working Directory에 "trained_model"이라는 이름으로 폴더를 하나 생성했습니다. 이제 해당 폴더에 "model.ckpt" 파일로 저장하라는 저장 명령을 실행하면,


1
2
## graph 저장
save_path <- saver$save(sess, "./trained_model/model.ckpt")
cs


이 폴더에 그래프 모델 관련 파일이 생성될 것입니다. 확장자 .ckpt는 Check Point를 의미합니다.


해당 폴더로 이동하여 어떤 파일들이 생성되었는지 구경해 봅시다.



모두 4개의 파일이 생성되었는데 각각 그 안에 뭐가 들어있는지 크게 관심 가지지 않으셔도 될 듯 합니다.


이렇게 해서 모델 및 변수를 저장하는 작업을 모두 마쳤습니다.

 

모델 및 변수 복구하기

모델 및 변수를 복구하기 전에, "정말 이 모델 및 변수가 디스크에 저장된 파일들로부터 복구된 것이구나"라는 강한 신념을 얻기 위해 우선 R을 종료 후 다시 실행하겠습니다.


재실행 후에는 반드시 TensorFlow 라이브러리를 다시 로딩해 주세요.


1
2
3
## tensorflow 라이브러리 임포트
if (! ("tensorflow" %in% rownames(installed.packages()))) { install.packages("tensorflow") }
base::require(tensorflow)
cs


R을 재실행 후에는 Working Directory가 앞서 생성한 trained_model 폴더가 있는 위치인지 확인하기 바랍니다.


이제 TensorFlow session을 실행하고,


1
2
## session 실행
sess <- tensorflow::tf$Session()
cs


meta graph 및 변수들을 로딩합니다:


1
2
3
## meta graph 및 변수 로딩
saver <- tensorflow::tf$train$import_meta_graph('./trained_model/model.ckpt.meta')
saver$restore(sess, tensorflow::tf$train$latest_checkpoint('./trained_model'))
cs


앞의 섹션에서 "bias"라는 이름을 가진 변수 b1에 2.0을 할당하였습니다. 이 값을 직접 불러와 보도록 하겠습니다:


> sess$run('bias:0')
[1] 2


할당된 값 2가 출력되었음을 확인할 수 있습니다.


이제 tensorflow::tf$get_default_graph() 함수를 이용하여 graph 변수에 기본 그래프 모델을 생성하고,


1
2
## placeholder 생성하고 이름으로 불러오기
graph <- tensorflow::tf$get_default_graph()
cs



"w1"과 "w2"라는 이름으로 tensor를 불어오는데 모두 0으로 초기화합니다:


1
2
w1 <- graph$get_tensor_by_name("w1:0")
w2 <- graph$get_tensor_by_name("w2:0")
cs


"op_to_restore"라는 이름으로 저장된 그래프 모델을 불러옵니다. 이 모델은 앞선 섹션에서 w4에 해당합니다. 왜냐하면, 오퍼레이션 w4에 "op_to_restore"라는 이름을 할당했기 때문입니다.


1
2
## "op_to_restore"라는 이름으로 저장된 그래프 모델 불러오기
w4 <- graph$get_tensor_by_name("op_to_restore:0")
cs


마지막으로, 테스트 오퍼레이션을 실행해 봅니다.


> sess$run(w4, feed_dict=dict(w1=8.0, w2=2.0))
[1] 20


w1, w2에 각각 8.0과 2.0을 할당했으니 결과는,


(8 + 2) × 2 = 20 이 됩니다.


결과가 제대로 나오는 것을 보니 저장된 파일로부터 그래프 모델과 변수가 제대로 복구되었음을 알 수 있습니다.


따라서, 이를 활용하면 학습시킨 모델을 향후 활용할 수 있을 것입니다. 특히, 데이터를 지속적으로 공급하여 학습 모델을 꾸준히 개선해 나가야 하는 상황이라면 앞서 학습한 모델을 이용하여 업데이트하는데 매우 요긴하게 사용될 수 있을 것입니다.

Comments