如何解决Keras训练CNN时MaxPoolingOp仅支持NHWC的输入格式报错问题
Keras CPU环境下MaxPoolingOp格式报错解决方案
报错根因
你遇到的Default MaxPoolingOp only supports NHWC on device type CPU报错,本质是TensorFlow CPU运行环境下,池化运算仅支持NHWC(即样本数、高度、宽度、通道数)的张量维度顺序,你之前修改没生效的核心原因是模型输入要求和数据生成器输出的张量格式不匹配,或者全局后端配置和层单独配置冲突。
解决步骤
- 步骤1:显式设置Keras全局数据格式,在代码最开头导入依赖后新增如下配置,覆盖默认可能存在的配置冲突:
from keras import backend as K K.set_image_data_format('channels_last')
- 步骤2:给所有卷积、池化层统一显式指定
data_format参数,不要依赖层的默认值,示例修改如下:
# 卷积层示例 model.add(layers.Conv2D(32, (3, 3), activation='relu',input_shape=(150, 150, 3),padding='same', data_format='channels_last')) # 池化层示例 model.add(layers.MaxPooling2D((2, 2),strides=(2,2), padding='same', data_format='channels_last'))
所有Conv2D、MaxPooling2D层都按上述格式补充data_format='channels_last'参数即可。
- 步骤3:如果你要使用
channels_first格式,除了修改模型input_shape为(3,150,150)、层的data_format参数外,还需要给ImageDataGenerator的flow_from_directory方法补充对应参数,保证生成的训练数据格式和模型要求一致,示例如下:
train_generator = train_datagen.flow_from_directory( train_dir, target_size=(150, 150), batch_size=20, class_mode='binary', data_format='channels_first' # 补充该参数对齐格式 ) # val_generator同理补充相同参数
- 步骤4:兼容版本废弃警告,Keras 2.4.3对应TensorFlow 2.x版本,
fit_generator已经被废弃,直接用fit方法即可支持生成器输入,替换原训练代码:
history = model.fit( train_generator, steps_per_epoch=100, epochs=30, validation_data=val_generator, validation_steps=50 )
内容的提问来源于stack exchange,提问作者kron_ninja
相关产品推荐
相关产品推荐

