Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中执行向后相关/卷积_Python_Numpy_Scipy_Conv Neural Network - Fatal编程技术网

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

如何在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

我正在尝试对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],
  [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.]]

     [[ -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]]])