映射到标签的Tensorflow服务预测

映射到标签的Tensorflow服务预测,tensorflow,tensorflow-serving,Tensorflow,Tensorflow Serving,我正在使用TensorFlow服务提供inception模型。我是在Azure Kubernetes上做这件事的,所以不是通过更标准、更完善的谷歌云 在任何情况下,这都是可行的,但我感到困惑的是,预测会以浮点数组的形式返回。这些值映射到培训期间传入的原始标签,但如果没有原始标签文件,则无法对每个概率所涉及的内容进行反向工程 在我开始服务之前,我只是简单地使用一个推理脚本,然后对标签文件进行交叉引用,我在训练时将其与冻结的模型一起存储。但在服务方面,这是行不通的 因此,我的问题是如何获得与模型关联

我正在使用TensorFlow服务提供inception模型。我是在Azure Kubernetes上做这件事的,所以不是通过更标准、更完善的谷歌云

在任何情况下,这都是可行的,但我感到困惑的是,预测会以浮点数组的形式返回。这些值映射到培训期间传入的原始标签,但如果没有原始标签文件,则无法对每个概率所涉及的内容进行反向工程

在我开始服务之前,我只是简单地使用一个推理脚本,然后对标签文件进行交叉引用,我在训练时将其与冻结的模型一起存储。但在服务方面,这是行不通的


因此,我的问题是如何获得与模型关联的标签,并在理想情况下获得预测以返回标签和概率?

我确信有一种方法可以使用各种TF ops直接为此返回映射,但我已设法至少将标签打包到模型中,并在预测中返回它们有可能

我所做的是从labels数组中创建一个tf.constant,然后将该张量添加到tf.saved_model.signature_def_utils.build_signature_def中的输出张量数组中


现在,当我得到一个预测时,我得到了浮点数组和一个标签数组,我可以在客户端对它们进行匹配。

我尝试了@user1371314建议的方法,但我无法让它工作。另一个有效的解决方案是创建张量(而不是常数),并在保存模型时仅将其与输出层的第一个元素映射。当你把它放在一起时,它看起来是这样的:

# get labels names and create a tensor from it
.... 
label_names_tensor = tf.convert_to_tensor(label_names)

# save the model and map the labels to the output layer
tf.saved_model.simple_save(
        sess,
        "./saved_models",
        inputs={'image': model.input},
        outputs={'label' : label_names_tensor,'prediction': model.output[0]})
当您在提供模型后进行预测时,您将得到以下结果:

{
    "predictions": [
        {
            "label": "label-name",
            "prediction": 0.114107
        },
        {
            "label": "label-name",
            "prediction": 0.288598
        },
        {
            "label": "label-name",
            "prediction": 0.17436
        },
        {
            "label": "label-name",
            "prediction": 0.186366
        },
        {
            "label": "label-name",
            "prediction": 0.236568
        }
    ]