关于scipy.ndimage.convolve(mode="nearest")与自定义卷积结果差异的问询
核的翻转操作遗漏:
scipy.ndimage.convolve执行的是标准卷积运算,会先将卷积核进行上下/左右翻转,再与输入数组做互相关(逐元素相乘求和)。如果你的实现直接用原核做滑动相乘求和,本质是互相关而非卷积,这会导致结果差异。可以先手动翻转核(比如用np.flip(kernel))后再和你的实现结果对比,看是否与scipy输出一致。滑动窗口的对齐偏差:确认核的中心位置与scipy的对齐规则一致。比如对于尺寸为
(k_h, k_w)的核,scipy会以核的中心元素对应输入数组的当前元素位置进行滑动计算。如果你的实现中窗口起始/结束位置偏移(比如把核的左上角作为对齐点),就会出现结果错位。填充后的边界计算逻辑:虽然用
np.pad(mode="nearest")模拟填充,但要注意scipy在处理卷积时,填充后数组的窗口选取范围是否和你的实现一致。比如输入数组为(H, W),填充后为(H+2*pad_h, W+2*pad_w),需确认你的实现是否正确遍历原数组每个位置,对应到填充数组的正确窗口范围。数据类型精度问题:如果你的实现使用了较低精度的数据类型(比如
float32),而scipy默认用更高精度(比如float64),可能会出现微小数值差异。可以统一数据类型后再对比。
验证建议:用小尺寸输入数组和核做测试,比如输入np.array([[1,2],[3,4]]),核np.array([[1,0],[0,1]]),分别输出scipy的结果和你的实现结果,逐元素对比差异,定位具体问题环节。
内容的提问来源于stack exchange,提问作者Firmino2019

