一段 backbone 按顺序是:conv3×3 stride2 → conv3×3 stride1 → maxpool2×2 stride2 → conv3×3 stride1(全部 same padding,无空洞)。最后一层输出上一个像素,对应到输入图像上的理论感受野是多少像素?请写出从后往前的推导过程。另外,把第三层的 maxpool2×2 stride2 换成 conv3×3 stride2,感受野变成多少?
面试官在考什么
是否真的会用递推公式算感受野(包含 stride 的连乘放大),而不是把各层核大小加起来。
回答框架 · 前两步
- 从后往前:RF=1;过最后一层 conv3×3 s1 → RF=1+(3-1)×1=3,jump=1;过 maxpool2×2 s2 → RF=3+(2-1)×1=4,jump=1×2=2;过第二个 conv3×3 s1 → RF=4+(3-1)×2=8,jump 仍为 2;过第一个 conv3×3 s2 → RF=8+(3-1)×2=12
- 递推式为 RF_i = RF_{i+1} + (k_i − 1) × ∏_{j>i} s_j,即每层的贡献要被它后面所有层的 stride 连乘放大
还有 3 条答案要点、 3 层追问、 5 个常见坑, 以及针对你简历的追问路径,在定制报告里。
延伸阅读
想看这个方向的整体准备路线? 进入「深度学习基础」方向页
同一能力域的其他题
- 某模块原来是单层 7×7 卷积:输入 56×56×64、输出 56×56×64、stride=1、padding=3。现在候选方案是堆 3 个 3×3 卷积(每层通道都是 64→64、stride=1、padding=1)。请回答:两者的感受野是否相同?参数量之比是多少?FLOPs 之比是多少(按乘法次数算即可)?并说明在什么样的场景下这个替换不划算。
- 在一个移动端实时语义分割任务中,输入 512×512,某阶段特征图为 64×64×128,需要下采样到 32×32×128,同时要尽量保留小目标边界。候选方案:A 3×3 stride=2 conv,padding=1;B 2×2 max pooling stride=2;C 3×3 average pooling stride=2;D 先 1×1 conv 把通道降到 64,再 3×3 stride=2 conv 升回 128。你会选哪种?请给出参数/乘加量级、对边界和小目标的影响,以及部署端算子支持/延迟上的取舍。
- 团队里有人提议把线上检测模型 backbone 中所有 MaxPool 全部换成 stride=2 的 3×3 卷积,理由是「池化丢信息、卷积可学习、精度更高」。模型输入 640×640,backbone 下采样 32 倍,当前在端侧 NPU 上单帧 38ms,业务预算是 33ms(30FPS),INT8 量化部署。作为技术负责人,你会批准、有条件批准还是否决?请给出你的判断依据和决策链。
- 在一个分割模型中,输入 512×512,backbone 前几层依次为:3×3 s1、3×3 s2、3×3 s1、2×2 maxpool s2、3×3 s1。请计算最后一个 3×3 输出特征图位置的理论感受野。若大目标直径约 200 像素,仅继续堆 3×3 s1 卷积需要多少层?你会怎么改结构,在计算量、特征图分辨率和感受野之间取舍?
- 你负责一个 512×512 输入的缺陷分割任务,目标尺寸跨度极大:小的约 8×8 像素,大的约 300×300 像素。当前 backbone 的理论感受野已经超过 900 像素,但小目标召回长期上不去,大目标边缘也发糊。团队中 A 主张「继续加空洞卷积扩大感受野」,B 主张「感受野早就够了,问题在别处」。你如何判断谁对,并给出下一步方案?
- 你复现一个分类网络:20 层 plain CNN(3×3 卷积 + BN + ReLU 堆叠)在 CIFAR-10 上训练误差 2%、测试误差 12%。把深度加到 56 层、其余超参完全不变,训练误差变成 8%、测试误差 14%。请给出你的判断:这是什么问题?接下来你会做什么?请说明为什么你的方案能解决它。