Keras调用predict函数报层输入形状不兼容ValueError求助
Keras调用predict时输入维度不匹配报错解决
问题现象
调用Keras的predict方法执行预测时,提前打印预测数据集形状为预期的(2, 90),对应2条样本、单条样本90个输入特征,但运行时抛出维度不匹配错误。
复现代码
scaler = MinMaxScaler() scaler2 = MinMaxScaler() normalized_data = scaler.fit_transform(dataset) normalized_predict_data = scaler2.fit_transform(predict_dataset) x = normalized_data[:, 0:90] y = normalized_data[:, 90] z = normalized_predict_data[:, 0:90] print(z.shape) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10) print(x_train.shape, x_test.shape, y_train.shape, y_test.shape) model = Sequential() model.add(Dense(4, input_dim=90, activation='relu')) model.add(Dense(32, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(16, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) history = model.fit(x_train, y_train, validation_split=0.33, epochs=50, batch_size=100, verbose=0) loss, accuracy = model.evaluate(x_test, y_test, verbose=0) print("Model loss: %.2f, Accuracy: %.2f" % ((loss * 100), (accuracy * 100))) Xnew = z ynew = model.predict(array([Xnew])) for item in Xnew: print("X=%s, Predicted=%s" % (item, ynew[0]))
报错信息
ValueError: Input 0 of layer "sequential" is incompatible with the layer: expected shape=(None, 90), found shape=(None, 2, 90)
错误原因
- 报错中的
None是Keras对批量样本维度的固定占位标识,代表可接收任意数量的输入样本,并非异常新增的维度,模型要求的输入形状(None, 90)属于正常定义,对应「N条样本、每条90个特征」的输入格式。 - 维度不匹配的核心问题是预测输入构造错误:
z本身形状已经是符合要求的(2, 90),但写array([Xnew])时相当于在原数组外额外嵌套了一层,将输入形状从(2, 90)改成了(1, 2, 90),Keras识别批量维度后,最终传入模型的输入形状就成了报错显示的(None, 2, 90),和模型要求的形状不符。 - 原有结果打印逻辑存在缺陷:无论输入多少条待预测样本,代码只会固定输出第一条样本的预测值。
修复方案
直接传入符合形状要求的输入即可,同时修正结果遍历逻辑,修改后的预测相关代码如下:
Xnew = z # 无需额外嵌套数组,直接传入形状为(2,90)的Xnew ynew = model.predict(Xnew) # 同步遍历样本和对应的预测结果 for item, pred in zip(Xnew, ynew): print("X=%s, Predicted=%s" % (item, pred))
内容的提问来源于stack exchange,提问作者basil3
相关产品推荐
相关产品推荐

