TensorFlow Serving客户端运行报错:输入尺寸不匹配签名
解决TensorFlow Serving客户端"input size does not match signature"错误
这个错误本质是客户端发送的输入张量和模型导出时定义的签名不匹配,不一定是模型和客户端完全不兼容,大概率是预处理逻辑或者输入张量的设置没对齐模型要求。我给你一步步拆解解决思路:
1. 先搞清楚模型的输入签名到底是什么
首先得明确你的flowers模型期望的输入格式,用TensorFlow自带的saved_model_cli工具就能查看:
saved_model_cli show --dir /path/to/your/model/exported_version --all
重点看SignatureDefs下的inputs部分,你会看到类似这样的信息:
inputs { key: "image_tensor" value { dtype: DT_FLOAT tensor_shape { dim { size: -1 } dim { size: 224 } dim { size: 224 } dim { size: 3 } } } }
这里的关键信息:输入张量的名称(比如image_tensor)、尺寸(224x224x3)、数据类型(DT_FLOAT),还有batch维度是-1(支持任意batch size)。
2. 检查客户端的图像预处理逻辑
你是基于Inception的客户端修改的,但flowers模型(比如常用的MobileNet/ResNet变种)和Inception的输入要求不一样:
- 尺寸问题:Inception通常要求299x299,而flowers模型大概率是224x224,找到客户端里的resize代码,比如:
# 原来的Inception预处理 image = tf.image.resize_images(image, (299, 299)) # 改成模型要求的尺寸 image = tf.image.resize_images(image, (224, 224)) - 归一化方式:不同模型的预处理规则不同,比如Inception可能是把像素值缩放到[-1,1],而flowers模型可能是直接除以255缩放到[0,1],或者做了均值减法。要和模型训练时的预处理保持一致。
3. 核对输入张量的名称和形状
客户端构造请求时,必须和模型签名的输入名称完全一致,同时张量形状要匹配:
- 比如模型签名里的输入名称是
image_tensor,客户端里不能写成inputs或者别的:# 错误示例:名称不匹配 request.inputs['inputs'].CopyFrom(...) # 正确示例:和签名一致 request.inputs['image_tensor'].CopyFrom(...) - 单张图片的话,张量形状应该是
(1, 224, 224, 3)(batch size=1,对应签名里的-1),检查客户端里的张量shape设置是否正确。
4. 验证输入数据的格式
- 确保图像是RGB三通道格式,有些模型训练时用的是BGR,这时候需要把图像通道反转:
# 如果模型要求BGR,就把RGB转成BGR image = image[:, :, ::-1] - 检查图像有没有被误转成灰度图(单通道),这也会导致尺寸不匹配。
5. 用简单请求验证服务是否正常
如果调整客户端后还是报错,可以用grpcurl工具发送一个符合签名的测试请求,排除服务端的问题:
# 发送一个随机的(1,224,224,3)张量请求 grpcurl -plaintext -d '{"model_spec":{"name":"your_model_name"}, "inputs":{"image_tensor":{"dtype":"DT_FLOAT","tensor_shape":{"dim":[{"size":1},{"size":224},{"size":224},{"size":3}]},"float_val": [0.0]*1*224*224*3]}}}' 172.17.0.2:9000 tensorflow.serving.PredictionService/Predict
如果这个请求能正常响应,说明服务端没问题,问题还是在客户端的预处理或张量构造上。
总结一下:先通过saved_model_cli明确模型的输入要求,再对应调整客户端的预处理、张量名称和形状,基本就能解决这个“尺寸不匹配”的问题。
内容的提问来源于stack exchange,提问作者Walacy Campos
相关产品推荐
相关产品推荐

