在Tensorflow-Serving中,能否仅获得前k个预测结果?

时间:2018-12-07 21:55:07

标签: tensorflow tensorflow-serving tensorflow-estimator

使用https://www.tensorflow.org/serving中的代码但使用DNNClassifier Estimator模型时,curl / query请求将返回所有可能的标签类及其相关分数。

使用具有100,000+种可能的输出/标签类的模型,响应会变得太大。有什么方法可以将输出数量限制为前k个结果吗? (类似于如何在喀拉拉邦完成)。

我唯一想到的可能是通过签名将一些参数输入到预测API中,但是我还没有找到任何可以提供此功能的参数。我已经阅读了大量的文档和代码,并用谷歌搜索了很多,但无济于事。

任何帮助将不胜感激。预先感谢您的任何回复。 <3

2 个答案:

答案 0 :(得分:1)

AFAIC,有两种方法可以满足您的需求。

  1. 您可以在引用this

  2. 的张量流服务源代码中添加一些行
  3. 在训练/训练模型时,您可以执行类似this的操作。

希望这会有所帮助。

答案 1 :(得分:0)

将其放在此处,以防他人受骗。可以覆盖head.py(由dnn.py使用)中的category_output()函数,以过滤前k个结果。您可以将此代码段插入main.py / train.py文件中,并且每当保存DNNClassifier模型时,该模型在进行推理/服务时将始终最多输出num_top_k_results。该方法的绝大部分是从原始的classification_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