运行Keras手写数字识别CNN代码报输入维度不匹配错误如何解决
问题原因
- 数据维度顺序不匹配:Keras默认使用
channels_last维度格式,要求输入张量维度顺序为(样本数, 高度, 宽度, 通道数),但你当前代码将MNIST数据reshape为(样本数, 通道数, 高度, 宽度)的channels_first格式,和模型第一层定义的input_shape=(28,28,1)要求不匹配,这是触发本次报错的直接原因 - 变量名大小写错误:导入模型类时写的是小写
sequential,实际实例化用的是大写Sequential;标注变量定义为小写y_train、y_test,调用fit和evaluate时写的是大写Y_train、Y_test,会额外触发变量未定义错误 - 卷积层参数写法不规范:旧版Keras中
Convolution2D(32,3,3)的写法在新版本中会被错误解析为步长参数,需要明确指定kernel_size参数避免后续运行异常
修复后的完整代码
import numpy as np np.random.seed(123) # 保证结果可复现 from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten from keras.layers import Convolution2D, MaxPooling2D from keras.utils import np_utils from keras.datasets import mnist (X_train, y_train), (X_test, y_test) = mnist.load_data() # 修正维度顺序为Keras默认的channels_last格式 X_train = X_train.reshape(X_train.shape[0], 28, 28, 1) X_test = X_test.reshape(X_test.shape[0], 28, 28, 1) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 y_train = np_utils.to_categorical(y_train, 10) y_test = np_utils.to_categorical(y_test, 10) model = Sequential() # 明确指定卷积核大小,避免参数解析错误 model.add(Convolution2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1))) model.add(Convolution2D(32, kernel_size=(3,3), activation='relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(10, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 修正变量名大小写 model.fit(X_train, y_train, batch_size=32, epochs=10, verbose=1) score = model.evaluate(X_test, y_test, verbose=0)
补充说明
如果你的环境强制要求使用channels_first格式,也可以不用修改reshape逻辑,仅将模型第一层的input_shape改为(1,28,28),同时在Keras全局配置中指定image_data_format='channels_first'即可正常运行。
内容的提问来源于stack exchange,提问作者Tuba Umer
相关产品推荐
相关产品推荐

