You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras构建CNN模型时MaxPooling2D层出现Negative dimension报错如何解决

错误原因
  • 核心问题是特征图经过多层卷积池化后尺寸过小,无法满足第三个池化层的计算要求:
    在你使用padding='VALID'(默认值,无边缘填充)的配置下,逐层计算特征图宽高变化如下:
    1. 输入尺寸:28x28
    2. 第一层4x4卷积输出:25x25 → 2x2池化后输出12x12
    3. 第二层4x4卷积输出:9x9 → 2x2池化后输出4x4
    4. 第三层4x4卷积输出:1x1 → 此时输入第三个2x2池化层时,1x1的特征图小于池化核尺寸,计算时维度变为负数,触发报错。
  • 隐藏问题:你在卷积层和全连接层之间没有添加Flatten()层,即使池化报错解决,后续运行也会因为维度不匹配报错。
  • 冗余配置:只有Sequential的第一层需要指定input_shape,后续卷积层的input_shape参数不会生效,属于无用配置。
解决方案

你可以选择以下任意一种方案修正代码:

方案1:删除第三个池化层,补全Flatten层(最简便)

修正后代码如下:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Dropout, Flatten

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Conv2D(filters = 64, kernel_size = (4,4), activation = 'relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Conv2D(filters = 64, kernel_size = (4,4), activation = 'relu'))
# 移除第三个池化层

model.add(Flatten()) # 新增:将4维特征图展平为1维,适配全连接层输入
model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))

model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])

方案2:调整卷积核尺寸,适配第三个池化层

将第三层卷积核改为3x3,第三层卷积输出变为2x2,可正常执行2x2池化:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Dropout, Flatten

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Conv2D(filters = 64, kernel_size = (4,4), activation = 'relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

# 调整卷积核为3x3
model.add(Conv2D(filters = 64, kernel_size = (3,3), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

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 = 'rmsprop', metrics = ['accuracy'])

方案3:给卷积层添加padding='same'配置

卷积时自动填充边缘,避免特征图尺寸快速缩小:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Dense, Dropout, Flatten

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (4,4), padding='same', input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Conv2D(filters = 64, kernel_size = (4,4), padding='same', activation = 'relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Conv2D(filters = 64, kernel_size = (4,4), padding='same', activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

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 = 'rmsprop', metrics = ['accuracy'])

内容的提问来源于stack exchange,提问作者Tusar Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:04