Как сделать простой CLI-запрос для сохраненной модели оценщика? - PullRequest
0 голосов
/ 06 июля 2018

Я успешно обучил DNNClassifier классифицировать тексты (сообщения с онлайн-форума). Я сохранил модель и теперь хочу классифицировать тексты с помощью интерфейса командной строки TensorFlow.

Когда я запускаю saved_model_cli show для моей сохраненной модели, я получаю следующее:

saved_model_cli show --dir /my/model --tag_set serve --signature_def predict
The given SavedModel SignatureDef contains the following input(s):
  inputs['examples'] tensor_info:
      dtype: DT_STRING
      shape: (-1)
      name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['class_ids'] tensor_info:
      dtype: DT_INT64
      shape: (-1, 1)
      name: dnn/head/predictions/ExpandDims:0
  outputs['classes'] tensor_info:
      dtype: DT_STRING
      shape: (-1, 1)
      name: dnn/head/predictions/str_classes:0
  outputs['logistic'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: dnn/head/predictions/logistic:0
  outputs['logits'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 1)
      name: dnn/logits/BiasAdd:0
  outputs['probabilities'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 2)
      name: dnn/head/predictions/probabilities:0
Method name is: tensorflow/serving/predict

Я не могу определить правильные параметры для saved_model_cli run, чтобы получить прогноз.

Я пробовал несколько подходов, например:

saved_model_cli run --dir /my/model --tag_set serve --signature_def predict --input_exprs='examples=["klassifiziere mich bitte"]'

Что дает мне это сообщение об ошибке:

InvalidArgumentError (see above for traceback): Could not parse example input, value: 'klassifiziere mich bitte'
 [[Node: ParseExample/ParseExample = ParseExample[Ndense=1, Nsparse=0, Tdense=[DT_STRING], dense_shapes=[[1]], sparse_types=[], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_input_example_tensor_0_0, ParseExample/ParseExample/names, ParseExample/ParseExample/dense_keys_0, ParseExample/ParseExample/names)]]

Как правильно передать мою входную строку в CLI для получения классификации?

Вы можете найти код моего проекта, включая данные обучения, на GitHub: https://github.com/pahund/beitragstuev

Я собираю и сохраняю свою модель следующим образом (упрощенно, , исходный код см. В GitHub):

embedded_text_feature_column = hub.text_embedding_column(
    key="sentence",
    module_spec="https://tfhub.dev/google/nnlm-de-dim128/1")
feature_columns = [embedded_text_feature_column]
estimator = tf.estimator.DNNClassifier(
    hidden_units=[500, 100],
    feature_columns=feature_columns,
    n_classes=2,
    optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))
feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
estimator.export_savedmodel(export_dir_base="/my/dir/base", serving_input_receiver_fn=serving_input_receiver_fn)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Кроме того, save_model_cli предоставляет другую опцию --input_examples вместо --input_exprs, так что вы можете передавать данные tf.Examples непосредственно в строку cmd, без ручной сериализации.

Например:

--input_examples 'examples=[{"sentence":["this is a sentence"]}]'

Подробнее см. https://www.tensorflow.org/guide/saved_model#--input_examples.

0 голосов
/ 14 июля 2018

ServingInputReceiver, который вы создаете для экспорта модели, указывает сохраненной модели ожидать сериализованных tf.Example протосов вместо необработанных строк, которые вы хотите классифицировать.

С Документация по сохранению и восстановлению :

Типичным шаблоном является то, что запросы на вывод поступают в форме сериализованных tf.Examples, поэтому serve_input_receiver_fn () создает заполнитель из одной строки для их получения. Затем serve_input_receiver_fn () также отвечает за анализ tf.Examples путем добавления операции tf.parse_example к графу.

....

Вспомогательная функция tf.estimator.export.build_parsing_serving_input_receiver_fn обеспечивает этот входной приемник для общего случая.

Таким образом, ваша экспортируемая модель содержит tf.parse_example оп, который ожидает получения сериализованных tf.Example протосов, удовлетворяющих спецификации функции, которую вы передали build_parsing_serving_input_receiver_fn, т.е. в вашем случае это ожидает сериализованных примеров , которые имеют функцию sentence. Чтобы предсказать с помощью модели, вы должны предоставить эти сериализованные прототипы.

К счастью, Tensorflow позволяет довольно легко их построить. Вот одна из возможных функций для возврата выражения, сопоставляющего клавишу ввода examples, с набором строк, которые затем можно передать в CLI:

import tensorflow as tf

def serialize_example_string(strings):

  serialized_examples = []
  for s in strings:
    try:
      value = [bytes(s, "utf-8")]
    except TypeError:  # python 2
      value = [bytes(s)]

    example = tf.train.Example(
                features=tf.train.Features(
                  feature={
                    "sentence": tf.train.Feature(bytes_list=tf.train.BytesList(value=value))
                  }
                )
              )
    serialized_examples.append(example.SerializeToString())

  return "examples=" + repr(serialized_examples).replace("'", "\"")

Итак, используя несколько строк, взятых из ваших примеров:

strings = ["klassifiziere mich bitte",
           "Das Paket „S Line Competition“ umfasst unter anderem optische Details, eine neue Farbe (Turboblau), 19-Zöller und LED-Lampen.",
           "(pro Stimme geht 1 Euro Spende von Pfuscher ans Forum) ah du sack, also so gehts ja net :D:D:D"]

print (serialize_example_string(strings))

команда CLI будет:

saved_model_cli run --dir /path/to/model --tag_set serve --signature_def predict --input_exprs='examples=[b"\n*\n(\n\x08sentence\x12\x1c\n\x1a\n\x18klassifiziere mich bitte", b"\n\x98\x01\n\x95\x01\n\x08sentence\x12\x88\x01\n\x85\x01\n\x82\x01Das Paket \xe2\x80\x9eS Line Competition\xe2\x80\x9c umfasst unter anderem optische Details, eine neue Farbe (Turboblau), 19-Z\xc3\xb6ller und LED-Lampen.", b"\np\nn\n\x08sentence\x12b\n`\n^(pro Stimme geht 1 Euro Spende von Pfuscher ans Forum) ah du sack, also so gehts ja net :D:D:D"]'

, который должен дать вам желаемый результат:

Result for output key class_ids:
[[0]
 [1]
 [0]]
Result for output key classes:
[[b'0']
 [b'1']
 [b'0']]
Result for output key logistic:
[[0.05852016]
 [0.88453305]
 [0.04373989]]
Result for output key logits:
[[-2.7780817]
 [ 2.0360758]
 [-3.0847695]]
Result for output key probabilities:
[[0.94147986 0.05852016]
 [0.11546692 0.88453305]
 [0.9562601  0.04373989]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...