2016-06-08 2 views
5

Я пытаюсь экспортировать модель, созданную и подготовленную с 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') 

Я не уверен, если эти две проблемы связаны между собой, или, если я просто не восстановить модель правильно питона.

+0

Как вы получили имя своего выходного узла? – agsolid

+2

Вы можете отслеживать имя при определении графика (с учетом областей видимости и т. Д.), Распечатывать тензор при его создании, печатать все узлы в графике (например, «для узла в tf.get_default_graph()). Node : print node.name'), или проверите графический def, сохраненный в текстовом формате. – ppries

ответ

6

Проблема заключается в порядок этих двух строк в исходной программе:

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') 

Вызов tf.train.Saver()добавляет набор узлов в графе, в том числе один называется "save/restore_all". Однако эта программа называет это после, выписывая график, поэтому файл, который вы передаете freeze_graph.py, не содержит тех узлов, которые необходимы для выполнения перезаписи.

реверса две строки должны сделать работу скрипта по назначению:

tf.train.Saver().save(sess, 'simple.ckpt') 
tf.train.write_graph(graph_def=sess.graph.as_graph_def(), logdir='.',  name='simple_as_binary.pb', as_text=False) 
+0

Ahhhhhh .... Это имеет смысл. Я должен был подумать об этом сам, я действительно заметил, что после инициализации Saver на графике были дополнительные узлы. Я только что протестировал его и, похоже, сработал. Спасибо за ваше время и помощь! – ppries

3

Итак, я получил это работает. Вроде.

Используя tensorflow.python.client.graph_util.convert_variables_to_constants непосредственно вместо первого сохранения GraphDef и контрольных точек на диск, а затем с помощью freeze_graph инструмента/сценария, я был в состоянии сохранить GraphDef, содержащим как график определения и переменных преобразуются в константы.

EDIT

mrry обновил свой ответ, который решается мой вопрос о freeze_graph не работает, но я оставлю этот ответ, а также, в случае, если кто-то может оказаться полезным.

Смежные вопросы