Keras模型预测时报dense层输入维度不兼容错误求助
报错原因及解决方案
第一段代码(心脏病预测+MNIST混合代码)
核心错误原因
- 代码逻辑混杂了两个完全无关的任务:前面加载处理了心脏病数据集,中途又加载MNIST手写数字数据集训练了专门适配MNIST的模型。该模型第一层
Flatten(input_shape=(28,28))要求输入是28*28的图像,展平后维度为784,你最后传入心脏病预测的样本只有14个特征,维度不匹配直接触发报错。 - 额外小问题:代码中调用了
plt.show()但没有导入matplotlib.pyplot库,运行时也会触发报错。
修正后的可运行代码
import numpy as np import pandas as pd import tensorflow as tf import matplotlib.pyplot as plt from google.colab import files uploaded = files.upload() import io df=pd.read_csv(io.BytesIO(uploaded['heart.csv'])) # 检查缺失值 df.isna().sum(axis="rows") from tensorflow.keras.utils import to_categorical # 拆分特征和标签 y=df["cp"] x=df.drop("cp",axis="columns") y=to_categorical(y) # 类别特征独热编码 x=pd.get_dummies(x,columns=["sex"]) # 可视化 df.hist(figsize=(10,10)) plt.show() # 构建适配心脏病数据集的模型 from keras.layers import Dense from keras.models import Sequential # 输入维度和特征数匹配,x.shape[1]就是当前特征数14 model = Sequential([ Dense(128,activation='relu', input_shape=(x.shape[1],)), tf.keras.layers.Dropout(0.2), # 输出维度和y的类别数匹配,y.shape[1]就是cp的类别数 Dense(y.shape[1], activation='softmax')]) model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"]) # 训练模型 model.fit(x, y, epochs=50) # 构造预测样本 data=pd.DataFrame({"age":[50],"trestbps":[120],"chol":[350],"fbs":[1],"restecg":[1],"thalach":[150],"exang":[0],"oldpeak":[1.5],"slope":[1],"ca":[0],"thal":[2],"target":[1],"sex_0":[0],"sex_1":[1]}) # 执行预测 print(model.predict(data))
第二段参考代码(泰坦尼克生存预测)
常见报错原因
- 特征维度不匹配:模型定义的
input_shape=(7,)要求输入特征维度为7,如果你调整了特征处理逻辑(比如多删除了列、新增了其他列的独热编码),导致最终X的特征数不是7,就会触发维度不匹配报错。 - 损失和标签格式不匹配:代码使用
categorical_crossentropy损失,要求标签y必须是独热编码后的格式,如果你注释了y=to_categorical(y)这行,直接传入原始1维标签就会报错。
修正方案
- 特征处理完成后打印
print(X.shape),确认最后一维的特征数,把模型的input_shape参数调整为和实际特征数一致。 - 确认标签y已经做了独热编码,或者把损失换成
SparseCategoricalCrossentropy就不需要提前做独热编码。
内容的提问来源于stack exchange,提问作者Keval Makwana
相关产品推荐
相关产品推荐

