为何手动卷积结果与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
相关产品推荐
相关产品推荐

