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

Keras使用.h5模型预测时出现输入维度不匹配错误

解决Keras预测时的ValueError:输入维度不匹配问题

先来看你遇到的错误:

ValueError: 检查输入时出错:预期dense_151_input具有3个维度,但得到形状为(2, 2100)的数组

这个问题的根源其实出在训练数据的维度构造错误上,导致模型的输入形状定义完全不符合实际数据结构,最终预测时就出现了维度不匹配的问题。我帮你拆解一下问题并给出修复方案:

问题分析

你在构造训练数据的时候,把两个特征列表(train_samples_temp_a和train_samples_temp_b)直接作为数组的行,转成numpy数组后形状是(2, 2100)。但实际上,每个样本应该是包含两个特征的一组数据(比如[a_i, b_i]),对应一个标签,所以正确的数据形状应该是(2100, 2)——也就是2100个样本,每个样本有2个特征。

而你在定义模型时设置了input_shape=(2,2100),这相当于告诉Keras:每个输入样本是一个2×2100的二维数组,但你的实际数据根本不是这个结构,这就埋下了训练和预测的维度隐患。

修复步骤

1. 修正训练数据的维度

在将train_samples转为numpy数组后,添加转置操作,把形状从(2,2100)调整为(2100,2):

# Convert both train_label and train_sample list into a numpy array
train_samples = np.array(train_samples)
train_samples = train_samples.T  # 新增这一行,转置数组修正维度
train_labels = np.array(train_labels)

2. 修正模型的输入形状

现在每个样本是包含2个特征的一维数组,所以模型的输入形状要改成(2,),同时可以去掉多余的Flatten()层(因为输入已经是一维的了,Flatten在这里毫无意义):

# Sequential Model
model = Sequential([
    Dense(16, input_shape=(2,), activation='relu'),  # 把input_shape从(2,2100)改为(2,)
    Dense(32, activation='relu'),
    Dense(2, activation='softmax')
])

3. 确保预测时的输入维度正确

预测时,你需要输入形状为(样本数, 2)的数组,并且要和训练时一样用MinMaxScaler做归一化。举个例子:

# 准备测试样本:2个样本,每个样本2个特征
test_samples = np.array([[25, 30], [70, 75]])
# 用训练时的scaler做归一化(注意用transform而不是fit_transform)
scaled_test_samples = scaler.transform(test_samples)
# 执行预测
predictions = model.predict(scaled_test_samples)

如果你的预测输入还是原来的(2,2100)形状,记得先转置成(2100,2),再做归一化和预测。

补充说明

其实你的训练代码本身就存在样本数和标签数不匹配的问题——scaled_train_samples形状是(2,2100)(2个样本),但train_labels有2100个标签,理论上训练时就应该报错。可能是你实际运行的代码有差异,或者Keras版本的兼容问题,但修正数据维度后,这个问题也会一并解决。

内容的提问来源于stack exchange,提问作者Ifeanyi Ndukwe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:58:50