AI Development/Tensorflow

[TensorFlow] .ckpt vs .pb vs .pbtxt 차이점

꾸준희 2019. 8. 3. 18:56
728x90
반응형

 

 

 

 

간단하게 말하자면 아래와 같다.

 

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

 

tensorflow/tensorflow

An Open Source Machine Learning Framework for Everyone - tensorflow/tensorflow

github.com

아래와 같은 형식으로 이루어져있다.

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 파일을 tensorboard 에 띄우기 예제

 

[TensorFlow] pb 파일 TensorBoard에 띄우기

import_pb_to_tensorboard.py # Copyright 2017 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in co..

eehoeskrap.tistory.com

 

 

 

 

 

 

 

 

 

 

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

 

[Tensorflow and Android] Tensorflow로 학습한 모델을 바이너리로 만들기 (얼려버리기)

http://blog.naver.com/cenodim/220967974766[Tensorflow and Android] Tensorflow로 학...

blog.naver.com

참고자료 2 : pb vs pbtxt

https://stackoverflow.com/questions/51948262/difference-between-pb-and-pbtxt-in-tensorflow

 

Difference between .pb and .pbtxt in tensorflow?

When saving a graph in tensorflow tf.train.write_graph(     graph_or_graph_def,     logdir,     name,     as_text=True ) There is this flag: as_text: If True, writes the graph as an ASCII proto. I

stackoverflow.com

https://stackoverflow.com/questions/44516609/tensorflow-what-is-the-relationship-between-ckpt-file-and-ckpt-meta-and-ckp

 

Tensorflow : What is the relationship between .ckpt file and .ckpt.meta and .ckpt.index , and .pb file

I used saver=tf.train.Saver() to save the model that I trained, and I get three kinds of files named: .ckpt.meta .ckpt.index .ckpt.data And a file called: checkpoint What is the connection wit...

stackoverflow.com

 

참고자료 3 : 체크포인트 파일 생성

http://jaynewho.com/post/8

 

tensorflow 로 checkpoint 파일(.ckpt)과 ckeckpoint state proto 이용하기 : Variable 저장과 재활용 | Jayne.who();

< Back tensorflow 로 checkpoint 파일(.ckpt)과 ckeckpoint state proto 이용하기 : Variable 저장과 재활용 deeplearning | 29 July 2017 Tags | tensorflow python tensorflow 로 학습시킨 딥러닝 모델을 저장하는 방법중 하나로 Checkpoint 을 이용하는 방법이 있다. Checkpoint 은 학습된 모델의 Variable 값을 저장하는 파일이다. Check

jaynewho.com

 

참고자료 4 :  ckpt to pb 

https://m.blog.naver.com/PostView.nhn?blogId=beodeulpiri&logNo=221049009911&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[Tensorflow] 모델 체크포인트 .ckpt 파일을 .pb 파일로 변환하기

텐서플로우 모델 파일형식인 체크포인트 파일은 모델에대한 메타정보도 모두 같이 있어서 전에 포스팅한 것...

blog.naver.com

 

728x90
반응형
1 2 3 4 5 6 7 8 ··· 15