使用Keras model.fit函数时遭遇InvalidArgumentError错误求助
问题解决:MaxPoolingOp仅支持CPU上的NHWC格式
错误原因
你的错误源于数据格式与TensorFlow/Keras默认要求不匹配。CPU环境下的MaxPooling2D层仅支持NHWC格式(样本数,高度,宽度,通道数),但你当前将图像数据reshape为了NCHW格式(样本数,通道数,高度,宽度),即(120000, 1, 28, 28),这导致池化层执行失败。
修复步骤
1. 调整图像数据格式
将图像reshape为NHWC格式,把通道维度移到最后:
# 替换原reshape代码 images_train_cnn = images_train.reshape(images_train.shape[0], 28, 28, 1).astype('float32') images_test_cnn = images_test.reshape(images_test.shape[0], 28, 28, 1).astype('float32') images_validation_cnn = images_validation.reshape(images_validation.shape[0], 28, 28, 1).astype('float32')
执行后,图像形状应为(120000, 28, 28, 1)这类格式。
2. 更新模型输入形状
修改Conv2D层的input_shape参数,匹配NHWC格式:
def cnn_model(): model = Sequential() # 将input_shape从(1,28,28)改为(28,28,1) model.add(Conv2D(30, (5, 5), input_shape=(28, 28, 1), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(15, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(50, activation='relu')) model.add(Dense(num_classes, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
验证与执行
修改完成后,重新运行模型拟合代码即可。此时数据格式符合CPU环境要求,池化层能正常执行。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

