如何在python中执行反向相关/卷积

我试图在 2 个矩阵上执行反向相关(至少我认为它是这样的)以获得结果矩阵。


注意:反向卷积也有效,因为我将其应用于 CNN。


我有以下两个矩阵:


vals:


[[ 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,填充相同(wrt vals),下面的代码给出了我想要的结果:


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.]]


两个结果中的任何一个concat都可以,但最好是包含填充的那个。


有谁知道不使用python循环的方法?我更喜欢使用 numpy 或其他一些库,因为它一定会比我的代码更快地执行相同的计算。


浮云间
浏览 124回答 2
2回答

摇曳的蔷薇

scipy.signal的convolve实际上是你想要的:from scipy.signal import convolveconvolve(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.ndimage.filters.convolve例如:>>> 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]])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python