如何在python中执行向后相关/卷积
我正在尝试对2个矩阵执行向后关联(至少我认为它是这样称呼的),以得到一个结果矩阵 注意:反向卷积也能工作,因为我将其应用于CNN 我有以下两个矩阵:如何在python中执行向后相关/卷积,python,numpy,scipy,conv-neural-network,Python,Numpy,Scipy,Conv Neural Network,我正在尝试对2个矩阵执行向后关联(至少我认为它是这样称呼的),以得到一个结果矩阵 注意:反向卷积也能工作,因为我将其应用于CNN 我有以下两个矩阵: VAL: [[ 2 1 -3 -4 -4] [ 2 -3 3 1 2] [ 2 5 -6 6 -2] [-5 4 1 5 4] [ 0 0 1 -3 -4]] w0: [[[0, 1, -1], [1, -1, 0], [0, 0, 0]], [[1, 0, 0], [0, -1, 1
VAL
:
[[ 2 1 -3 -4 -4]
[ 2 -3 3 1 2]
[ 2 5 -6 6 -2]
[-5 4 1 5 4]
[ 0 0 1 -3 -4]]
w0
:
[[[0, 1, -1],
[1, -1, 0],
[0, 0, 0]],
[[1, 0, 0],
[0, -1, 1],
[1, 0, 1]],
[[ 1, -1, 0],
[-1, 0, -1],
[-1, 0, 1]]]
我基本上想应用一个滑动窗口,除了在这种情况下,w0
的所有值乘以vals
中每个点的标量值,然后与相邻值相加
假设步幅为1,填充相同(wrtvals
),下面的代码给出了我想要的结果:
concat = np.zeros((3,7,7))
for k in range(len(w0)):
for i in range(len(vals)):
for j in range(len(vals[i])):
v = w0[k] * vals[i][j]
concat[k][i:i+v.shape[0], j:j+v.shape[1]] += v
print(concat)
导致:
[[[ 0. 2. -1. -4. -1. 0. 4.]
[ 2. 1. -9. 5. -2. 5. -2.]
[ 2. -3. 9. -13. 13. -10. 2.]
[ 2. -2. -2. 9. -4. 1. -4.]
[ -5. 9. -3. 5. -5. -5. 4.]
[ 0. 0. 1. -4. -1. 4. 0.]
[ 0. 0. 0. 0. 0. 0. 0.]]
[[ 2. 1. -3. -4. -4. 0. 0.]
[ 2. -5. 4. 5. 3. 0. -4.]
[ 4. 4. -2. -3. -7. -5. -2.]
[ -3. -1. 3. 14. -3. 9. 0.]
[ 2. 10. -12. 11. -16. 7. 2.]
[ -5. 4. -4. 8. 9. 6. 0.]
[ 0. 0. 1. -3. -3. -3. -4.]]
[[ 2. -1. -4. -1. 0. 4. 0.]
[ 0. -6. 7. 1. 8. 2. 4.]
[ -2. 5. -11. 19. -12. -3. -6.]
[ -9. 7. 0. -11. 8. -9. 4.]
[ 3. -9. 13. -14. -10. 5. -6.]
[ 5. -4. -7. 2. 0. 8. 8.]
[ 0. 0. -1. 3. 5. -3. -4.]]]
然后我会收缩以排除填充,因此:
print(concat[:,1:-1, 1:-1])
>>> [[[ 1. -9. 5. -2. 5.]
[ -3. 9. -13. 13. -10.]
[ -2. -2. 9. -4. 1.]
[ 9. -3. 5. -5. -5.]
[ 0. 1. -4. -1. 4.]]
[[ -5. 4. 5. 3. 0.]
[ 4. -2. -3. -7. -5.]
[ -1. 3. 14. -3. 9.]
[ 10. -12. 11. -16. 7.]
[ 4. -4. 8. 9. 6.]]
[[ -6. 7. 1. 8. 2.]
[ 5. -11. 19. -12. -3.]
[ 7. 0. -11. 8. -9.]
[ -9. 13. -14. -10. 5.]
[ -4. -7. 2. 0. 8.]]]
concat
的两个结果中的任何一个都可以,但最好是包含填充的结果
有人知道不使用python循环的方法吗?我更喜欢使用numpy或其他库,因为它一定会比我的代码更快地执行相同的计算
编辑:
我还想在w0
上执行相同类型的向后关联,因此再次使用vals
,而不是使用:
a
:
[[[2, 0, 2, 2, 2],
[1, 1, 0, 2, 0],
[0, 0, 1, 2, 2],
[2, 2, 2, 0, 0],
[1, 0, 1, 2, 0]],
[[1, 2, 1, 0, 1],
[0, 2, 0, 0, 1],
[0, 0, 2, 2, 1],
[2, 0, 1, 0, 2],
[0, 1, 2, 2, 2]],
[[0, 0, 2, 2, 2],
[0, 1, 2, 1, 0],
[0, 0, 0, 2, 0],
[0, 2, 0, 0, 2],
[0, 0, 2, 2, 1]]]
在这种情况下,沿着a
取一个3x3的滑动窗口,填充为1,将滑动窗口中的所有值乘以vals
中标量值的相关索引,最后得到与w0
相同大小的输出。以下代码实现了这一点:
concat = np.zeros((3,3,3))
for k in range(len(w0)):
f = np.pad(a[k], 1)
for i in range(len(vals)):
for j in range(len(vals[i])):
v = f[i:i+w0.shape[1], j:j+w0.shape[2]] * vals[i][j]
concat[k] += v
与:
你可以看看
例如:
>>> 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
>>> ndimage.convolve(a, k, mode='constant', cval=0.0)
array([[11, 10, 7, 4],
[10, 3, 11, 11],
[15, 12, 14, 7],
[12, 3, 7, 0]])
scipy.signal
的convolve
实际上就是您想要的:
from scipy.signal import convolve
convolve(vals[None, :, :], w0)[:, 1:-1, 1:-1]
Out[]:
array([[[ 1, -9, 5, -2, 5],
[ -3, 9, -13, 13, -10],
[ -2, -2, 9, -4, 1],
[ 9, -3, 5, -5, -5],
[ 0, 1, -4, -1, 4]],
[[ -5, 4, 5, 3, 0],
[ 4, -2, -3, -7, -5],
[ -1, 3, 14, -3, 9],
[ 10, -12, 11, -16, 7],
[ 4, -4, 8, 9, 6]],
[[ -6, 7, 1, 8, 2],
[ 5, -11, 19, -12, -3],
[ 7, 0, -11, 8, -9],
[ -9, 13, -14, -10, 5],
[ -4, -7, 2, 0, 8]]])
这是正常的卷积。我想做一个反向关联。谢谢!我实际上在做一些实验,发现做
scipy.signal.correlate
然后做np.flip(w0)
可以满足我的需要。现在只记得这正是信号。convolve
所做的,哈哈
from scipy.signal import convolve
convolve(vals[None, :, :], w0)[:, 1:-1, 1:-1]
Out[]:
array([[[ 1, -9, 5, -2, 5],
[ -3, 9, -13, 13, -10],
[ -2, -2, 9, -4, 1],
[ 9, -3, 5, -5, -5],
[ 0, 1, -4, -1, 4]],
[[ -5, 4, 5, 3, 0],
[ 4, -2, -3, -7, -5],
[ -1, 3, 14, -3, 9],
[ 10, -12, 11, -16, 7],
[ 4, -4, 8, 9, 6]],
[[ -6, 7, 1, 8, 2],
[ 5, -11, 19, -12, -3],
[ 7, 0, -11, 8, -9],
[ -9, 13, -14, -10, 5],
[ -4, -7, 2, 0, 8]]])