搭建 UNet 训练分割任务时抛出 Calculated output size (128x0x0),本质是卷积、池化、下采样堆叠太多,输入图尺寸太小,经过多次下采样之后特征图高宽被压缩到 0,无法继续卷积 / 池化;UNet 经典的编码器层层下采样,每一次 maxpool 都会让特征图减半,很多人照搬标准 UNet 的 4 次下采样结构,却没有根据输入分辨率做适配,输入过小就会提前坍缩到 1×1,再做一次池化就直接变成 0×0。标准 UNet 默认适合 572×572 这类大图输入,4 次 maxpool 之后瓶颈层是 32×32;如果输入只有 64×64、32×32 甚至更小,同样 4 轮下采样,很快就到 1×1,再池化就溢出报错。
报错基础信息清单
- 报错原文:Calculated output size (128x0x0)
- 含义:输出特征图 H/W 计算结果为 0,卷积 / 池化无法执行
- 高发场景:UNet、U-Net++、UperNet 编码器下采样
- 核心规律:每一次 maxpool2d (kernel_size=2,stride=2),高宽 //2
- 示例:输入 32×32,3 次下采样→4×4;4 次下采样→2×2;5 次下采样→1×1;再 pool 就 0×0
- 快速验算公式:
Hout=⌊sHin+2p−k⌋+1
p=padding,k=kernel,s=stride
分步排查与修复流程
- 打印输入 tensor shape,确认输入分辨率:print(x.shape),重点看 H、W
- 逐层正向推演每一层输出尺寸,定位是哪一层卷积或 pool 把尺寸压到 1×1 之后继续下采样
- 可选修复方案(任选其一或组合)
- UNet 结构配套注意:编码器下采样次数要和解码器上采样次数一一对应,改了编码器层数,解码器也要同步删减,不然 skip 连接尺寸对不上
方案 A:减少下采样层数,把 4 次下采样改成 2/3 次,去掉后面的 pool 块
方案 B:增大输入图像尺寸,满足最小分辨率要求
方案 C:调整 padding,不要随便用 valid,改用 same padding,保留尺寸
方案 D:把 maxpool 替换成 stride 卷积,同时控制下采样倍率,不要固定每次减半
方案 E:瓶颈层增加判断,特征图到 1×1 之后不再做下采样
典型踩坑示例
- 输入 32×32,4 次 2×2 池化:32→16→8→4→2;再加一次 pool → 1×1,再 pool 就报错 0×0
- 输入 64×64,5 次下采样:64→32→16→8→4→2,继续 pool 就出问题
- 很多开源 UNet 代码写死 4 层 down,直接拿来跑小图,必触发这个尺寸报错
结构设计经验
UNet 的最小安全输入 = ;4 次下采样最小输入≥16;5 次下采样最小≥32;如果你的输入小于这个阈值,就必须减少下采样轮次。
【相关 FAQ】
问题 1:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,这个报错代表什么?
回答 1:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,代表卷积或者池化运算算出来特征图高或者宽等于 0,无法生成特征图,UNet 场景大多是下采样轮次太多,特征图已经压到 1×1 还继续池化。
问题 2:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,标准 4 层 UNet 最低支持多大输入?
回答 2:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,标准 4 次 2 倍下采样的 UNet,想要稳定跑,输入高宽至少≥16;小于这个尺寸,很容易坍缩到 1×1 进而报错。
问题 3:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,不改输入大小怎么修复?
回答 3:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,可以减少下采样的层数,同步删减解码器上采样模块,或者修改 padding 策略,避免特征图快速收缩。
问题 4:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,padding='same' 能不能完全避免这个报错?
回答 4:Calculated output size (128x0x0):UNet 在池化前已只剩 1×1,same padding 只能控制卷积不收缩尺寸,对 stride=2 的 maxpool 无效,池化依然会减半,到 1×1 后 pool 依旧会变成 0×0。
【参考资料】
[2025-03](PyTorch CNN output size 0 error)PyTorch forum
[2024-07](UNet 输入尺寸与下采样层数匹配)GitHub UNet repo issue
[2025-01](Conv2d 输出尺寸计算公式)PyTorch 官方文档
[2024-09](小分辨率医学分割 UNet 结构改造)arXiv
[2025-02](UNet skip connection 尺寸对齐踩坑)Stack Overflow
【免责声明】
本文为分割模型 UNet 尺寸报错排错笔记,实际输出尺寸和 kernel、stride、padding、dilation 全部相关,不同版本代码、算子参数结果有差异;本文仅技术问题解读,不构成模型结构生产落地担保。
