Keras 2.9多输入模型调用model.predict预测失败问题求助
嘿,我看了你遇到的Keras多输入模型预测问题,咱们一步步拆解解决它~
问题核心原因
你的模型在训练时接收的是带批量维度的两个输入张量,但预测时传入的输入缺少了关键维度:
- 模型期望的MLP输入是
(None, 4)(None代表批量大小,4是参数向量长度),但你传的是(4,)(没有批量维度) - 模型期望的CNN输入是
(None, 512, 512, 1)(最后一个1是单通道图像的通道维度),但你传的是(512,512)(既没批量维度,也没通道维度)
这就是第一个报错“Data cardinality is ambiguous”的根源——模型误以为你要传4个参数样本和512个图像样本,数量不匹配;第二个generator报错则是因为输入签名和模型期望的维度不匹配,导致模型只接收到一个输入张量。
解决方案1:直接修正输入维度(最简单高效)
只需要给每个输入补上批量维度,同时给图像加上通道维度即可:
import numpy as np import imageio import tensorflow as tf # 加载训练好的模型 model = tf.keras.models.load_model(modelDir) # 处理图像:补通道+批量维度 image = imageio.imread(filename) image = np.multiply(image, 1.0 / 255.0) # 归一化 # 灰度图补通道维度:(512,512) → (512,512,1) image = np.expand_dims(image, axis=-1) # 补批量维度:(512,512,1) → (1,512,512,1) image = np.expand_dims(image, axis=0) # 处理参数:补批量维度 repeatParameter = 2 paraShape = (repeatParameter * 2,) parameter = np.empty(paraShape, dtype=float) # 填充你的参数值... # 补批量维度:(4,) → (1,4) parameter = np.expand_dims(parameter, axis=0) # 现在预测就能正常运行了 tempDiff = 5.0 * model.predict((parameter, image))
解决方案2:修正Generator推理代码
如果你坚持要用generator做推理,需要确保generator返回的输入维度和模型完全匹配:
import numpy as np import imageio import tensorflow as tf def generate(aParameter, aImage): # 先给输入修正维度 # 参数补批量维度:(4,) → (1,4) aParameter = np.expand_dims(aParameter, axis=0) # 图像补通道+批量维度:(512,512) → (1,512,512,1) aImage = np.expand_dims(aImage, axis=-1) aImage = np.expand_dims(aImage, axis=0) def generator(): while True: # 返回包含两个输入的元组,和训练时的格式一致 yield (aParameter, aImage) dataset = tf.data.Dataset.from_generator( generator, output_signature=( tf.TensorSpec(shape=(1, 4), dtype=tf.float32), tf.TensorSpec(shape=(1, 512, 512, 1), dtype=tf.float32) ) ) return dataset # 调用逻辑 image = imageio.imread(filename) image = np.multiply(image, 1.0 / 255.0) model = tf.keras.models.load_model(modelDir) repeatParameter = 2 paraShape = (repeatParameter * 2,) parameter = np.empty(paraShape, dtype=float) # 填充你的参数值... # 生成数据集并预测 pred_dataset = generate(parameter, image) tempDiff = 5.0 * model.predict(pred_dataset, steps=1)
验证小技巧
你可以在预测前先打印模型期望的输入形状,确保你的输入和它匹配:
print("模型期望的输入形状:") for input_layer in model.input: print(input_layer.shape)
正常输出应该是:
(None, 4) (None, 512, 512, 1)
你只需要把None替换成1(单样本批量)就符合要求了。
内容的提问来源于stack exchange,提问作者Balázs Bämer
相关产品推荐
相关产品推荐

