Я пытаюсь экспортировать модель, созданную и подготовленную с Keras, в протобуфер, который можно загрузить в сценарии C++ (как в этом примере). Я создал файл .pb, содержащий определение модели и файл .ckpt, содержащий данные контрольной точки. Однако, когда я пытаюсь объединить их в один файл, используя скрипт freeze_graph я получаю ошибку:Ошибка сценария tensorflow freeze_graph на модели, определенной с помощью Keras
ValueError: Fetch argument 'save/restore_all' of 'save/restore_all' cannot be interpreted as a Tensor. ("The name 'save/restore_all' refers to an Operation not in the graph.")
Я спасаю модель, как это:
with tf.Session() as sess:
model = nndetector.architecture.models.vgg19((3, 50, 50))
model.load_weights('/srv/nn/weights/scratch-vgg19.h5')
init_op = tf.initialize_all_variables()
sess.run(init_op)
graph_def = sess.graph.as_graph_def()
tf.train.write_graph(graph_def=graph_def, logdir='.', name='model.pb', as_text=False)
saver = tf.train.Saver()
saver.save(sess, 'model.ckpt')
nndetector.architecture.models. vgg19 ((3, 50, 50)) - это просто модель, подобная vgg19, определенная в Keras.
Я звоню сценарий freeze_graph так:
bazel-bin/tensorflow/python/tools/freeze_graph --input_graph=[path-to-model.pb] --input_checkpoint=[path-to-model.ckpt] --output_graph=[output-path] --output_node_names=sigmoid --input_binary=True
Если я запустить сценарий freeze_graph_test
все работает отлично.
Кто-нибудь знает, что я делаю неправильно?
Спасибо.
С наилучшими пожеланиями
Филипп
EDIT
Я пытался печати tf.train.Saver().as_saver_def().restore_op_name
которая возвращает save/restore_all
.
Кроме того, я попытался простой чистый tensorflow пример и все еще получаю ту же ошибку:
a = tf.Variable(tf.constant(1), name='a')
b = tf.Variable(tf.constant(2), name='b')
add = tf.add(a, b, 'sum')
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
tf.train.write_graph(graph_def=sess.graph.as_graph_def(), logdir='.', name='simple_as_binary.pb', as_text=False)
tf.train.Saver().save(sess, 'simple.ckpt')
И я на самом деле также не в состоянии восстановить граф в питона. Используя следующий код throws ValueError: No variables to save
, если я выполняю его отдельно от сохранения графика (то есть, если я сохраню и восстановит модель в том же скрипте, все будет хорошо).
with gfile.FastGFile('simple_as_binary.pb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Session() as sess:
tf.import_graph_def(graph_def)
saver = tf.train.Saver()
saver.restore(sess, 'simple.ckpt')
Я не уверен, если эти две проблемы связаны между собой, или, если я просто не восстановить модель правильно питона.
Как вы получили имя своего выходного узла? – agsolid
Вы можете отслеживать имя при определении графика (с учетом областей видимости и т. Д.), Распечатывать тензор при его создании, печатать все узлы в графике (например, «для узла в tf.get_default_graph()). Node : print node.name'), или проверите графический def, сохраненный в текстовом формате. – ppries