错误:测试预测时“在签名 def 中找不到服务默认值”

Posted

技术标签:

【中文标题】错误:测试预测时“在签名 def 中找不到服务默认值”【英文标题】:Error: "serving_default not found in signature def" when testing prediction 【发布时间】:2021-12-18 12:21:59 【问题描述】:

我关注了这个tutorial 并来到了可以使用以下代码测试预测的地步:


   "instances": [
     "csv_row": "44, Private, 160323, Some-college, 10, Married-civ-spouse, Machine-op-inspct, Husband, Black, Male, 7688, 0, 40, United-States", "key": "dummy-key"
   ]
 

但是,我收到以下错误:


  "error": " \"error\": \"Serving signature name: \\\"serving_default\\\" not found in signature def\" "

我认为输入格式不代表预期的输入,但并不完全应该是预期的。

关于是什么导致示例代码抛出此错误的任何想法?

【问题讨论】:

您可以尝试将标志”--signature-name predict” 添加到您的“gcloud ai-platform predict”命令中吗?我能够成功地从模型中获得预测。 其实就是你说的 只是:--signature-name "predict" 【参考方案1】:

我终于想通了:我在 jupyter notebook 中加载了 tensorflow 模型并打印了签名:

new_model = tf.keras.models.load_model('modelPath')
print(list(new_model.signatures.keys())) 

结果是:[u'predict']

所以我用来获得预测的命令是:

georg@Georgs-MBP ~ % gcloud ai-platform predict --model $MODEL_NAME --version "v1" --json-instances sample_input.json --format "value(predictions[0].classes[0])" --signature-name "预测"

结果: 使用端点 [https://europe-west3-ml.googleapis.com/]

【讨论】:

自从您提出问题后,您需要将此标记为答案。【参考方案2】:

添加签名服务默认:

import tensorflow as tf
m = tf.saved_model.load("tf2-preview_inception_v3_classification_4")
print(m.signatures) # _SignatureMap() - Empty
t_spec = tf.TensorSpec([None,None,None,3], tf.float32)
c_func = m.__call__.get_concrete_function(inputs=t_spec)
signatures = 'serving_default': c_func
tf.saved_model.save(m, 'tf2-preview_inception_v3_classification_5', signatures=signatures)

# Test new model
m5 = tf.saved_model.load("tf2-preview_inception_v3_classification_5")
print(m5.signatures) # _SignatureMap('serving_default': <ConcreteFunction signature_wrapper(*, inputs) at 0x17316DC50>)

【讨论】:

以上是关于错误:测试预测时“在签名 def 中找不到服务默认值”的主要内容,如果未能解决你的问题,请参考以下文章

我的 CNN 分类器对随机图像给出了错误的预测

获取预测模型在测试集中预测错误的数据样本

不可预测的 GameCenter 断开连接错误 [沙盒]

H2O AutoML 错误测试/验证数据集有一个非分类列,它在训练数据中是分类的“预测

是啥让我的模型在笔记本电脑和 colab 上运行时预测错误值?

使用线性回归模型预测单个值时出错