В Tensorflow-Serving возможно ли получить только результаты прогноза top-k? - PullRequest
0 голосов
/ 08 декабря 2018

При использовании кода в https://www.tensorflow.org/serving,, но с моделью оценщика DNNClassifier запрос curl / query возвращает все возможные классы меток и связанные с ними оценки.

Использование модели с 100 000+ возможныхклассы вывода / метки, ответ становится слишком большим.Есть ли способ ограничить количество выводов результатами top-k?(Подобно тому, как это можно сделать в keras).

Единственная возможность, о которой я могу подумать, - это ввести какой-либо параметр в API прогнозирования через сигнатуры, но я не нашел параметров, которые бы обеспечивали эту функциональность.,Я прочитал тонну документации + кода и погуглил тонну, но безрезультатно.

Любая помощь будет принята с благодарностью.Заранее спасибо за любые ответы.<3 </p>

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Размещаем это здесь на случай, если это кому-нибудь поможет.Возможно отменить функциюification_output () в head.py (который используется dnn.py) для фильтрации результатов top-k.Вы можете вставить этот фрагмент в свой файл main.py / train.py, и всякий раз, когда вы сохраняете модель DNNClassifier, эта модель всегда будет выводить самое большее num_top_k_results при выполнении вывода / обслуживания.Подавляющее большинство метода скопировано из исходной функцииification_output ().(Обратите внимание, что это может или не может работать с 1.13 / 2.0, поскольку он не был протестирован на тех.)

from tensorflow.python.estimator.canned import head as head_lib

num_top_k_results = 5

def override_classification_output(scores, n_classes, label_vocabulary=None):
  batch_size = array_ops.shape(scores)[0]
  if label_vocabulary:
    export_class_list = label_vocabulary
  else:
    export_class_list = string_ops.as_string(math_ops.range(n_classes))
  # Get the top_k results
  top_k_scores, top_k_indices = tf.nn.top_k(scores, num_top_k_results)
  # Using the top_k_indices, get the associated class names (from the vocabulary)
  top_k_classes = tf.gather(tf.convert_to_tensor(value=export_class_list), tf.squeeze(top_k_indices))
  export_output_classes = array_ops.tile(
      input=array_ops.expand_dims(input=top_k_classes, axis=0),
      multiples=[batch_size, 1])
  return export_output.ClassificationOutput(
      scores=top_k_scores,
      # `ClassificationOutput` requires string classes.
      classes=export_output_classes)

# Override the original method with our custom one.
head_lib._classification_output = override_classification_output
0 голосов
/ 17 декабря 2018

AFAIC, есть 2 способа удовлетворить ваши потребности.

  1. Вы можете добавить несколько строк в исходный код, обслуживающий тензор, ссылаясь на this

  2. Вы можете сделать что-то вроде this во время обучения / переподготовки вашей модели.

Надеюсь, это поможет.

...