CAFFE-SSD中pool3层输出维度计算不符的技术疑问
解答:Caffe池化层输出尺寸的取整逻辑
这问题我之前调试SSD模型时踩过同款坑,咱们一步步理清楚:
1. 先纠正公式计算的小疏漏
你提到的通用公式是对的:Wout = (Win − kernel + 2*padding)/stride +1,但你之前的计算漏了最后+1的步骤。代入你的参数(Win=75,kernel=2,padding=0,stride=2),正确的浮点数结果是:
(75 - 2 + 0)/2 + 1 = 36.5 + 1 = 37.5
这就解释了为什么会出现非整数的中间值,而Caffe的整数计算逻辑才是问题的核心。
2. Caffe池化层的ceil_mode参数是关键
Caffe的池化层设计了一个ceil_mode参数,直接决定了输出尺寸的取整规则:
- 默认情况(
ceil_mode: false):使用C++原生的整数除法(向下取整)计算(Win - kernel + 2*pad)/stride,再加1。对应你的例子就是(75-2)/2 = 36(向下取整),+1后得到37,这就是你说的“向下取整”结果。 - 开启
ceil_mode: true时:采用向上取整的逻辑计算,在整数环境下的实现技巧是(Win - kernel + 2*pad + stride -1)/stride(等价于浮点数的向上取整),再加1。代入你的例子:
这正好和你用(75 - 2 + 0 + 2 -1)/2 + 1 = 74/2 +1 = 37 +1 =38net.blobs['pool3'].shape得到的结果一致。
3. 为什么SSD模型里会是38?
SSD的特征图尺寸和预设的先验框(Anchor)数量强绑定,论文中指定的特征图尺寸是经过精确设计的。为了严格匹配这个尺寸,SSD的Caffe实现会显式给池化层设置ceil_mode: true——你可能没注意到这个参数,它可能被省略在你贴出的代码片段里,但实际模型定义里肯定有这个配置(或者SSD的初始化代码默认开启了这个参数)。
内容的提问来源于stack exchange,提问作者Wahaj
相关产品推荐
相关产品推荐

