TensorFlow Serving部署SavedModel时第二个签名报形状缺失错误
解决TensorFlow Serving调用签名时的"Tensor name: prediction has no shape information"错误
这个错误的核心原因是你通过tf.cond生成的label张量的静态形状信息没有被正确追踪和记录到SavedModel中,导致TensorFlow Serving无法识别输出张量的形状。
问题分析
你的第二个签名输出label是通过tf.cond动态返回的字符串标量,虽然每个分支的tf.constant都指定了shape=[],但TensorFlow有时无法自动推断tf.cond输出张量的静态形状,进而在构建SavedModel的签名信息时,无法为该张量生成有效的shape描述,最终导致Serving调用失败。
解决方案
我们需要显式为label张量设置静态形状,确保TensorFlow能正确记录它的形状信息。具体可以通过以下两步修改:
- 在定义
label后,显式设置其静态形状 - (可选)将签名的输出key改为更清晰的名称(比如
"label"),避免和第一个签名的"prediction"混淆
修改后的关键代码片段
# post processing to output label pred = tf.gather_nd(model.output, (0,0)) # 定义label时保持原有逻辑,但显式设置静态形状 label = tf.cond(pred > 0.5, lambda: tf.constant('Dog', shape=[]), lambda: tf.constant('Cat', shape=[])) # 显式设置静态形状,确保TensorFlow能识别这是一个标量 label.set_shape(tf.TensorShape([])) # 可选:给label张量一个明确的名称,方便调试 label = tf.identity(label, name='final_label') # ... 其他代码保持不变 ... # 2nd signature(修改后可正常工作) x_info = tf.saved_model.utils.build_tensor_info(x_input) y_info = tf.saved_model.utils.build_tensor_info(label) # 修改输出key为"label",更直观 label_signature = build_signature_def(inputs={"image": x_info}, outputs={"label": y_info}, method_name='tensorflow/serving/predict')
调用代码的对应说明
因为我们把第二个签名的输出key改成了"label",调用后预期返回会是{"predictions": "Dog"}(如果输入是狗的图片),你的原有调用代码无需修改,只需注意输出结果的对应关系即可。
为什么这样有效
通过label.set_shape(tf.TensorShape([])),我们强制告诉TensorFlow这个张量是一个标量(无维度的张量),这样在调用tf.saved_model.utils.build_tensor_info时,就能正确生成包含形状信息的张量描述,TensorFlow Serving在加载模型时就能识别该输出张量的形状,从而避免"no shape information"的错误。
内容的提问来源于stack exchange,提问作者Lance
相关产品推荐
相关产品推荐

