Keras/Tensorflow - h5/hdf5からckptへの変換方法
以前、ckptからpbへの変換方法をブログに書きましたが、今回はKerasのh5/hdf5形式からckptへ変換する方法を調べましたので、ここにメモしておきます。
変換方法
私の環境でうまくいったサンプルコードです。
from keras import backend as K from keras.models import load_model import tensorflow as tf K.clear_session() K.set_learning_phase(0) model = keras.models.load_model("xxx.h5") sess = keras.backend.get_session() saver = tf.train.Saver() save_path = saver.save(sess, "xxxx.ckpt")
上のリンクのckptからpbへ変換する方法と組み合わせるとh5/hdf5形式からpb形式に変換することができます。
また、こちらの手法では直接h5/hdf5からpbに変換することができます。
1回で済むのでこちらの方が手軽かもしれません。
from keras import backend as K from keras.models import load_model import tensorflow as tf def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True): from tensorflow.python.framework.graph_util import convert_variables_to_constants graph = session.graph with graph.as_default(): freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or [])) output_names = output_names or [] output_names += [v.op.name for v in tf.global_variables()] # Graph -> GraphDef ProtoBuf input_graph_def = graph.as_graph_def() if clear_devices: for node in input_graph_def.node: node.device = "" frozen_graph = convert_variables_to_constants(session, input_graph_def, output_names, freeze_var_names) return frozen_graph def main(): model = load_model('xxx.h5') frozen_graph = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs]) # Save pb file tf.train.write_graph(frozen_graph, "SAVE_PATH", "xxxx.pb", as_text=False) if __name__ == '__main__': main()
参考サイト
https://stackoverflow.com/questions/52650842/how-to-convert-hdf5-to-tensorflow-checkpoint
https://www.dlology.com/blog/how-to-convert-trained-keras-model-to-tensorflow-and-make-prediction/