간단하게 말하자면 아래와 같다.
ckpt 파일
모델의 변수(가중치)인 체크포인트 파일
pb 파일
모델의 변수 + 구조 (즉, 전체 그래프) 로 이루어진 바이너리 파일
pbtxt 파일
pb 파일을 읽을 수 있는 텍스트 파일, 즉 모델 구조 파악 가능
더욱 자세히 말하자면 아래와 같다 ...
ckpt 파일
텐서플로우에서 학습된 모델의 구조를 제외한 변수들을 담고 있는 파일이다. 즉, 모델의 가중치만 담고있는 파일이다. 그래서 모델에 대한 메타정보를 담고있기 때문에 재학습이 가능하다는 특징이 있다. 하지만, 실제 모델을 돌릴 때 필요 없는 정보들이 너무 많아서 파일의 크기가 무겁다는 단점이 있다.
체크포인트의 저장은 다음과 같이 이루어지며, iteration 별로 체크포인트 파일을 생성 할 수 있다.
#/model/train.py
with tf.Session(graph=g) as sess :
# Saver instance 를 생성한다.
# Saver.save(sess, ckpt_path)
# Saver.restore(sess, ckpt_path)
saver = tf.train.Saver()
sess.run(tf.global_variables_initializer())
# 그래프를 돌리다가 Variable 을 저장하고 싶을 때 Saver.save() 메서드를 사용한다.
# args : tf.Session, job`s checkpoint file path
# return : job`s checkpoint file path (String)
ckpt_path = saver.save(sess, "saved/train1")
print("job`s ckpt files is save as : ", ckpt_path)
이 때, 체크포인트는 아래 세가지로 구성된다.
- train1.ckpt.data-00000-of-00001
- 모델의 구조를 제외한 모든 변수들을 포함, 모델 복원시 메타파일과 데이터 파일을 이용
- train1.ckpt.index
- 데이터파일과 메타파일을 올바르게 매핑하기 위한 내부적으로 필요한 인덱스 파일임
- train1.ckpt.meta
- 메타 그래프를 포함, 변수 값을 제외한 그래프의 구조를 담음
이 때 체크포인트 파일을 모바일이나 C++ 기반 프로그램에서 사용하기 위해서 pb 파일로 변환이 가능하다.
바로 tensorflow 에 내장되어있는 freeze_graph.py 가 있다.
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/tools/freeze_graph.py
아래와 같은 형식으로 이루어져있다.
def freeze_graph(input_graph,
input_saver,
input_binary,
input_checkpoint,
output_node_names,
restore_op_name,
filename_tensor_name,
output_graph,
clear_devices,
initializer_nodes,
variable_names_whitelist="",
variable_names_blacklist="",
input_meta_graph=None,
input_saved_model_dir=None,
saved_model_tags=tag_constants.SERVING,
checkpoint_version=saver_pb2.SaverDef.V2):
그런데 여기서 제일 신경써야할 부분이 output_node_names 이다. 자기가 만든 모델이라면 tensorboard 를 통해 모델의 구조를 확인하고 마지막 노드를 알 수 있는데, 자신이 만든 모델이 아니라면 모델 그래프 구조가 어떻게 되어있는지 알기 힘들다.
그래서 ckpt 파일을 만들 때 iteration을 1번만 돌려서 graph.pbtxt 를 생성할 수 있다.
이 파일에 노드 정보들이 모두 기록되기 때문에 필요한 노드를 찾을 수 있다. (하지만 양이 방대함)
경험상... ckpt 파일과 pbtxt 파일을 가지고 의심되는 마지막 노드들을 이용하여 pb 파일을 만들어서,
만들어진 pb 파일을 이용하여 tensorboard 를 통해 마지막 노드를 찾는 것이 더 수월하였다.
ckpt + pbtxt 파일을 이용하여 pb 파일을 만드는 예제
import tensorflow as tf
from tensorflow.python.tools import freeze_graph
def main():
freeze_graph.freeze_graph('/graph.pbtxt', "", False,
'/checkpoint.ckpt', 'output_node_name',
"save/restore_all", "save/Const",
'frozen.pb', True, "")
print('done.')
if __name__ == '__main__':
main()
pb 파일
pb 파일은 ckpt 파일과는 달리 모델 구조와 가중치 값이 합쳐진 파일이다. 그래서 재학습이 불가능하다. pb 파일은 tensorflow 기반으로 만들어진 모델을 모바일이나, C++ 프로그램에서 사용하고자 할 때 사용되는 파일 형식이다. 마찬가지로 TensorRT 를 위해서도 사용 될 수 있다.
.pb vs .pbtxt
이는 Binary 이냐 Text 냐 의 문제이다. pb 파일은 pbtxt 파일에 비해 이진 파일로 이루어져있기 때문에 용량이 작지만, pbtxt 파일은 사람이 읽을 수 있는 형식인 text 파일 이므로 디버깅 및 편집에 적합하다는 특징이 있다. 하지만 텐서플로우 그래프의 구조를 담은 pbtxt 는 엄청난 정보를 담고 있기 때문에 파일 용량이 크다.
pb 및 pbtxt 저장하는 방법
tensorflow 에서 그래프를 저장하는 함수는 다음과 같다.
tf.train.write_graph(
graph_or_graph_def,
logdir,
name,
as_text=True
)
예를 들어 아래와 같이 작성하여 그래프를 저장할 수 있다.
tf.train.write_graph(
sess.graph_def,
"./",
"graph.pb",
as_text=True
)
이 때, as_text=True 는 pbtxt 파일이 생성되며, as_text=False 는 pb 파일이 생성된다.
참고자료 1 : pb 에 대한 자료
https://m.blog.naver.com/cenodim/220967993466
참고자료 2 : pb vs pbtxt
https://stackoverflow.com/questions/51948262/difference-between-pb-and-pbtxt-in-tensorflow
참고자료 3 : 체크포인트 파일 생성
참고자료 4 : ckpt to pb
'AI Development > TensorFlow | TFLite' 카테고리의 다른 글
[TensorFlow] TensorFlow 소스 빌드 (Ubuntu 16.04 + GPU + CUDA 10.0 + python + cuDNN 7.3.1) (0) | 2019.10.18 |
---|---|
[TensorFlow] Graph 에서 dropout 을 제거하는 방법 (0) | 2019.08.03 |
[TensorFlow] 함수 내부에서 TensorFlow Graph 실행하기 (0) | 2019.08.03 |
[TensorFlow] pb 파일 TensorBoard에 띄우기 (TF 1.x 버전용) (0) | 2019.05.31 |
[TensorFlow] Anaconda 가상환경 이용하여 TensorFlow GPU 설치 (2) | 2019.03.05 |