错误:测试预测时“在签名 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 中找不到服务默认值”的主要内容,如果未能解决你的问题,请参考以下文章
H2O AutoML 错误测试/验证数据集有一个非分类列,它在训练数据中是分类的“预测