Keras训练MNIST全连接网络时出现输入形状不兼容错误如何修复
错误原因
- 输入形状不兼容:MNIST数据集加载后的原始图像数据形状为
(样本数, 28, 28),对应单通道28*28像素的手写数字图,但你搭建的全连接网络第一层定义的输入形状为(28,),仅能接收长度为28的一维向量,二者维度不匹配触发报错。 - 额外隐藏问题:你当前使用的损失函数
categorical_crossentropy要求标签为独热编码格式,直接加载的train_y/test_y是0-9的整数标签,不处理的话形状匹配后也会触发报错。
修复方案
你只需要做3处修改即可:
- 将28*28的二维图像压平为长度784的一维向量,同时对像素值做归一化处理提升训练稳定性
- 修正模型输入维度为784
- 对标签做独热编码,或者将损失函数替换为
sparse_categorical_crossentropy省去编码步骤
以下是修复后的完整可运行代码:
from keras.utils import np_utils from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, BatchNormalization, Dropout, Activation import seaborn as sns from keras.initializers import RandomNormal from keras.initializers import he_normal import matplotlib.pyplot as plt (train_X, train_y), (test_X, test_y) = mnist.load_data() # 新增:将图像压平为一维向量,同时归一化像素值到0-1 train_X = train_X.reshape(-1, 28*28).astype('float32') / 255 test_X = test_X.reshape(-1, 28*28).astype('float32') / 255 # 新增:将标签转换为独热编码 train_y = np_utils.to_categorical(train_y, 10) test_y = np_utils.to_categorical(test_y, 10) output_dim = 10 # 修改:输入维度改为784 input_dim = train_X.shape[1] batch_size = 128 nb_epoch = 20 model_drop = Sequential() model_drop.add(Dense(512, activation='relu', input_shape=(input_dim,),kernel_initializer=he_normal(seed=None))) model_drop.add(BatchNormalization()) model_drop.add(Dropout(0.5)) model_drop.add(Dense(128, activation= 'relu', kernel_initializer=he_normal(seed=None))) model_drop.add(BatchNormalization()) model_drop.add(Dropout(0.5)) model_drop.add(Dense(output_dim, activation = 'softmax')) model_drop.summary() model_drop.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) history = model_drop.fit(train_X, train_y, batch_size=batch_size, epochs=nb_epoch, verbose=1, validation_split=0.1)
你提到的错误截图如下:
内容的提问来源于stack exchange,提问作者Ceren Keklik
相关产品推荐
相关产品推荐

