Как правильно создать save_model.pb? - PullRequest
2 голосов
/ 03 мая 2019

Я пытался создать файл saved_model.pb (из файлов .ckpt, .meta), который необходим для того, чтобы сделать вывод.Я могу успешно создать файл, который содержит saved_model.pb и переменные, однако при развертывании моего скрипта я получаю KeyError на ожидаемых тензорах:

y_probs = [my_predictor._fetch_tensors['y_prob_{}'.format(p)] for p in protocols]

KeyError: 'y_prob_protocol1'

Проблема, вероятно, заключается в том, как яопределили мои входы / выходы (см. код в конце), потому что тензоры подачи и выборки пусты, как вы можете видеть ниже:

my_predictor = predictor.from_saved_model('export')

SavedModelPredictor with feed tensors {} and fetch_tensors {}
saver = tf.train.import_meta_graph(opts.model)
builder = tf.saved_model.builder.SavedModelBuilder(opts.out_path)

with tf.Session() as sess:
    # Restore variables from disk.
    saver.restore(sess, opts.checkpoint)
    print("Model restored.")

    input_tensor = tf.placeholder(tf.float32, shape=(None,128,128,128,1), name='tensors/component_0')
    tensor_1 = tf.placeholder(tf.float32, shape=(None,128,128,128,2), name='pred/Reshape')
    tensor_2 = tf.placeholder(tf.float32, shape=(None,128,128,128,3), name='pred1/Reshape')


    tensor_info_input = tf.saved_model.utils.build_tensor_info(input_tensor)
    tensor_info_1 = tf.saved_model.utils.build_tensor_info(tensor_1)
    tensor_info_2 = tf.saved_model.utils.build_tensor_info(tensor_2)


    prediction_signature = (
        tf.saved_model.signature_def_utils.build_signature_def(
            inputs={'x': tensor_info_input},
            outputs={'y_prob_protocol1': tensor_info_1, 'y_prob_protocol2':tensor_info_2},
            method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

    builder.add_meta_graph_and_variables(
        sess, [tf.saved_model.tag_constants.SERVING],
        signature_def_map={
            'predict_images':
                prediction_signature,
        })

    builder.save()   

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 15 мая 2019

Я подозреваю, что может быть две причины этой ошибки:

  1. Восстановленная модель (сохраненная с использованием контрольных точек) может быть неправильно связана с builder.save(), saved_model.pb file.

  2. Вы использовали 2 выхода, tensor_info_1 и tensor_info_2 в SignatureDef.Но они не определены (по крайней мере в показанном коде)По определению я имею в виду что-то вроде

    y = tf.nn.softmax(tf.matmul(x, w) + b, name='y').

Вы можете использовать этот простой сценарий для преобразования контрольных точек и метафайлов в файл .pb.Но вы должны указать имена выходных узлов.

import tensorflow as tf

meta_path = 'model.ckpt-22480.meta' # Your .meta file
output_node_names = ['output:0']    # Output nodes

with tf.Session() as sess:

    # Restore the graph
    saver = tf.train.import_meta_graph(meta_path)

    # Load weights
    saver.restore(sess,tf.train.latest_checkpoint('.'))

    # Freeze the graph
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(
        sess,
        sess.graph_def,
        output_node_names)

    # Save the frozen graph
    with open('output_graph.pb', 'wb') as f:
      f.write(frozen_graph_def.SerializeToString())

Это преобразование - слишком много работы.Вместо сохранения модели в Check Points и последующей попытки преобразования ее в .pb file, вы можете сохранить модель, графики и SignatureDefs напрямую в .pb file, используя SavedModelBuilder или export_saved_model.

Пример кода для сохранения модели с использованием SavedModelBuilder приведен в ссылке ниже.

Это официальный код, предоставленный службой поддержки Google Tensorflow, и рекомендуется следовать этому коду (поток и структура).

https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...