首次编写Python程序运行Keras model.fit()遇输入形状不兼容错误
解决model.fit()输入形状不匹配错误
错误原因分析
- 重复加载数据覆盖预处理结果:代码中先对MNIST训练集做了归一化和扁平化处理,但后续又重新调用
mnist.load_data(),把已处理好的X_train覆盖回原始的(60000,28,28)形状。 - 输入形状与模型不匹配:模型第一层定义
input_shape=(784,),期望输入是扁平化的一维向量(每个样本784个特征),但当前传入的是二维图像形状(28,28)。 - 标签格式不兼容损失函数:使用
categorical_crossentropy作为损失函数时,要求标签为独热编码格式,而原始Y_train是整数标签,会导致训练报错。
修正后的完整代码
import numpy as np import pandas as pd from matplotlib import pyplot as plt import keras from keras.datasets import mnist import seaborn as sns from keras.models import Sequential from keras.layers import Dense, Dropout from sklearn.metrics import confusion_matrix from keras.optimizers import Adam from keras.utils import to_categorical # 加载MNIST数据 (X_train, Y_train), (X_test, Y_test) = mnist.load_data() # 可视化训练样本 for i in range(9): plt.subplot(330 + 1 + i) plt.imshow(X_train[i], cmap=plt.get_cmap('gray')) plt.show() # 数据归一化与扁平化处理 X_train = X_train / 255.0 X_train = X_train.reshape(X_train.shape[0], -1) # 转换为(60000, 784)形状 X_test = X_test / 255.0 X_test = X_test.reshape(X_test.shape[0], -1) # 标签转为独热编码格式 Y_train = to_categorical(Y_train, num_classes=10) Y_test = to_categorical(Y_test, num_classes=10) # 构建神经网络模型 model = Sequential([ Dense(units=10, input_shape=(784,), activation='relu'), Dense(units=10, activation='softmax') ]) model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.01), metrics=['accuracy']) model.summary() # 启动模型训练 batch_size = 50 epochs = 5 model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs)
关键修正点说明
- 移除重复数据加载:仅调用一次
mnist.load_data(),避免覆盖预处理后的数据集。 - 正确扁平化输入:通过
reshape(X_train.shape[0], -1)将28×28的图像转为784维一维向量,匹配模型输入要求。 - 标签独热编码:使用
keras.utils.to_categorical()将整数标签转换为独热编码,适配categorical_crossentropy损失函数。
内容的提问来源于stack exchange,提问作者omar Radi
相关产品推荐
相关产品推荐

