You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:37:38