TensorFlow卷积神经网络出现Negative Dimension size报错如何解决
错误含义
该错误表示你搭建的CNN在特征提取过程中,特征图的空间维度变为负数,无法完成卷积计算。错误日志明确显示,执行第四个Conv2D层时,输入的特征图尺寸已经是1×1,而你配置的卷积核尺寸为2×2、步长为2、填充方式为VALID,计算得到的输出维度为负数,因此触发异常。
卷积层使用VALID填充时的输出尺寸计算公式为:输出尺寸 = floor((输入尺寸 - 卷积核尺寸)/步长) + 1
代入当前参数计算:floor((1 - 2)/2) + 1 = -1 + 1 = 0,维度小于1不合法,因此抛出错误。
配置错误点
你的网络中多次使用步长为2的卷积+2×2池化的组合,特征图尺寸压缩速度过快,在进入第四个卷积层前就已经被压缩到1×1,无法支撑你设置的2×2卷积核、步长2的卷积操作。
我们可以逐层推导特征图尺寸变化(假设输入IMAGE_SIZE为S):
- 第一层:3×3卷积(same padding,步长1)→ 输出S×S,经过2×2池化 → 尺寸变为
S/2 × S/2 - 第二层:3×3卷积(valid padding,步长2)→ 输出
floor((S/2 -3)/2)+1,经过2×2池化 → 尺寸再缩小一半 - 第三层:2×2卷积(same padding,步长1)→ 尺寸不变,经过2×2池化 → 尺寸再次缩小一半
- 进入第四层时特征图尺寸已经为1×1,无法匹配2×2卷积核的计算要求。
修复方案
你可以任选以下一种方案解决问题:
- 修改第四个
Conv2D层的配置,将填充方式改为same,或者将步长调整为1,保证1×1的输入可以正常完成卷积计算 - 减少前面的池化层数量,或者将池化层的步长从默认的2改为1,降低特征图的压缩速度
- 若你的输入
IMAGE_SIZE过小(如小于32),可以适当放大输入图片的分辨率,避免特征图过早被压缩到1×1 - 直接删除第四个
Conv2D层,在第三层的池化层后直接接GlobalAveragePooling2D,也可以正常完成模型构建
内容的提问来源于stack exchange,提问作者Shashi7679
相关产品推荐
相关产品推荐

