必须显式resize图像至模型要求尺寸(如224×224),并确保dtype为float32、batch维度正确(shape为(1,224,224,3))、通道顺序符合channels_last格式,三者缺一不可。

因为输入张量的形状没对上模型占位符或第一层的预期尺寸,不是数据类型或代码语法的问题,是空间分辨率、批维度、通道顺序这三块中的某一块没对齐。
输入图像尺寸与模型要求不一致
最常见的是送进去的图是 (227, 227, 3),但模型第一层只认 (224, 224, 3)。TensorFlow 不会自动缩放,np.expand_dims 或 astype 都不能解决这个——它们改不了像素数。
- 必须显式 resize:用
tf.image.resize(TF2)或tf.image.resize_images(TF1,已弃用) - 注意 resize 前要确保 dtype 是
float32,否则 TF 可能报错 - resize 后别忘了检查 shape:打印
tf.shape(input_tensor)确认是(1, 224, 224, 3)而不是(224, 224, 3)
batch 维度缺失或多余
模型期望输入是 (None, 224, 224, 3),意思是“任意 batch size,但每张图必须是 224×224×3”。如果你只传一张图,shape 是 (224, 224, 3),就会报错;如果误加了两次 batch 维,变成 (1, 1, 224, 224, 3),也会挂。
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 单图预测务必用
np.expand_dims(img, axis=0)补 batch 维,不是axis=1或axis=-1 - 用
model.input_shape查模型真正要什么:返回(None, 224, 224, 3)就说明第一个轴是 batch - Keras 模型调用时,
model(img[np.newaxis, ...])和model(np.expand_dims(img, 0))等价,别混用np.newaxis和None
通道顺序搞反(channels_first vs channels_last)
TensorFlow 默认是 channels_last(即 (batch, height, width, channels)),但如果你从 PyTorch 加载数据、或用了 OpenCV 读图再转 NumPy,可能默认是 (height, width, channels) —— 看起来一样,但模型内部卷积核期待的 layout 不同。
立即学习“Python免费学习笔记(深入)”;
- 查 Keras 后端配置:
~/.keras/keras.json里"image_data_format"是"channels_last"还是"channels_first" - OpenCV 读图是 BGR,且 shape 是
(h, w, 3),直接喂给模型前要cv2.cvtColor(img, cv2.COLOR_BGR2RGB)+np.expand_dims(..., 0) - 如果模型是
channels_first格式(少见但存在),得用tf.transpose(x, (0, 3, 1, 2))或np.moveaxis(x, -1, 1)
真正卡住人的地方,往往不是某一行代码写错了,而是 resize、expand_dims、transpose 这几个操作的顺序和目标 shape 没对齐——比如先 resize 再 expand_dims,和先 expand_dims 再 resize,在 TF1 的 resize_images 里行为不同;又比如 transpose 放在 resize 前后,结果像素排列可能出人意料。动手前,先 print 出每一步的 .shape 和 .dtype,比猜快得多。

















