You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何手动卷积结果与scipy.ndimage.convolve不一致?

卷积结果不符的核心原因:混淆了卷积与互相关

你手动计算的是互相关(Cross-Correlation),而scipy.ndimage.convolve执行的是标准卷积(Convolution),二者的核心区别在于是否翻转卷积核。

为什么左上角结果是11?

标准卷积的第一步是对卷积核进行上下、左右双向翻转:
原卷积核k:

[[1,1,1],
 [1,1,0],
 [1,0,0]]

翻转后的核变为:

[[0,0,1],
 [0,1,1],
 [1,1,1]]

接下来用这个翻转后的核,与输入矩阵a左上角补零后的区域(mode='constant'会在边界补0)做对应元素相乘求和:
补零后的左上角区域:

[[0,0,0],
 [0,1,2],
 [0,5,3]]

计算过程:
0*0 + 0*0 + 0*1 + 0*0 + 1*1 + 2*1 + 0*1 + 5*1 + 3*1 = 1+2+5+3=11,和scipy输出的结果完全一致。

如何得到你预期的结果?

如果你想实现不翻转核的计算(也就是你手动做的互相关),应该用scipy.ndimage.correlate:

import numpy as np
a = np.array([[1, 2, 0, 0],
              [5, 3, 0, 4],
              [0, 0, 0, 7],
              [9, 3, 0, 0]])
k = np.array([[1,1,1],[1,1,0],[1,0,0]])
from scipy import ndimage
print(ndimage.correlate(a, k, mode='constant', cval=0.0))

输出就是你预期的:

[[ 1  8  5  0]
 [ 8 11  5  4]
 [ 8 17 10 11]
 [ 9 12 10  7]]

额外说明

很多深度学习框架中的“卷积层”,实际实现的是互相关操作(因为翻转核不影响训练效果,还能节省计算),这也是容易混淆二者的常见原因。

内容的提问来源于stack exchange,提问作者user2047830

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:52:23