Keras构建CNN调用Conv2D层报负维度错误如何解决
报错原因
核心是Conv2D层参数传参顺序错误,误将步长设置为了3,导致特征图尺寸快速缩小到1x1后,再做3x3卷积时出现负维度。
- Keras中
Conv2D的前三个位置参数顺序为Conv2D(filters, kernel_size, strides=(1,1), padding='valid', ...) - 你代码里写的
Conv2D(32, 3, 3)、Conv2D(64, 3, 3),第三个位置传的3会被识别为步长参数,等价于步长设为(3,3),而非你预期的3x3卷积核、步长1。 - 按错误参数推导尺寸变化:
- 输入100x100x3 → 第一层3x3卷积步长3 → 输出33x33x32
- 第二层3x3卷积步长3 → 输出11x11x32
- 2x2池化 → 输出5x5x32
- 第三层3x3卷积步长3 → 输出1x1x64
- 第四层3x3卷积步长3作用在1x1特征图上,计算输出尺寸时1-3得到负数,直接触发你看到的报错,和报错日志里的输入形状(None,1,1,64)、步长[1,3,3,1]完全吻合。
修复方案
所有卷积层的卷积核参数显式传为元组,不要占用步长的参数位置,保持默认步长(1,1)即可。
修正后的模型定义代码:
def create_model(): model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), padding='valid', input_shape=(100, 100, 3))) model.add(Activation('relu')) model.add(Conv2D(32, kernel_size=(3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Conv2D(64, kernel_size=(3, 3), padding='valid')) model.add(Activation('relu')) model.add(Conv2D(64, kernel_size=(3, 3))) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(2)) model.add(Activation('softmax')) return model
避坑提示
写Keras层时,除了第一个必填的filters(卷积核数量)参数外,其余参数尽量显式指定参数名(比如写kernel_size=(3,3)而不是只传位置参数),避免记错参数顺序触发这类维度错误。
内容的提问来源于stack exchange,提问作者jeffrey widjaya
相关产品推荐
相关产品推荐

