Python scipy.signal';s卷积与计算结果不同

Python scipy.signal';s卷积与计算结果不同,python,numpy,scipy,convolution,Python,Numpy,Scipy,Convolution,我想讨论一下卷积在CNN和图像滤波中的应用。。。如果你有一个RGB图像(尺寸为 3XIX)和 k< /代码>筛选器,每个大小 3xfxf,那么你将得到一个 kx(i-f+1)x(i-f+1)输出,假设你的步幅是“代码>1</Cord 从我读到的卷积的所有资料来看,你基本上是在图像上滑动每个滤波器,在每个阶段计算大量的点积,然后将它们相加得到一个值 例如: I -> 3x5x5 matrix F -> 3x2x2 matrix I * F -> 1x4x4 matrix (假

我想讨论一下卷积在CNN和图像滤波中的应用。。。如果你有一个RGB图像(尺寸为<代码> 3XIX)和<代码> k< /代码>筛选器,每个大小<代码> 3xfxf,那么你将得到一个<代码> kx(i-f+1)x(i-f+1)输出,假设你的步幅是“代码>1</Cord<”,而你只考虑完全重叠的区域(没有填充)。p> 从我读到的卷积的所有资料来看,你基本上是在图像上滑动每个滤波器,在每个阶段计算大量的点积,然后将它们相加得到一个值

例如:

I -> 3x5x5 matrix
F -> 3x2x2 matrix
I * F -> 1x4x4 matrix 
(假设
*
是卷积运算。)

现在,由于内核和图像具有相同数量的通道,因此最终将把3D卷积分解为多个并行2D卷积,然后进行矩阵求和

因此,上述示例在所有意图和目的下(假设没有填充,我们只考虑完全重叠的区域)都应与此相同:

I -> 3x5x5 matrix
F -> 3x2x2 matrix
(I[0] * F[0]) + (I[1] * F[1]) + (I[2] * F[2]) -> 1x4x4 matrix
我只是分离每个通道并单独卷积它们。请仔细看看这个,如果我错了,请纠正我

现在,假设这是有意义的,我用python进行了以下实验

import scipy.signal
import numpy as np
import test

x = np.random.randint(0, 10, (3, 5, 5)).astype(np.float32)
w = np.random.randint(0, 10, (3, 2, 2)).astype(np.float32)

r1 = np.sum([scipy.signal.convolve(x[i], w[i], 'valid') for i in range(3)], axis=0).reshape(1, 4, 4)

r2 = scipy.signal.convolve(x, w, 'valid')

print r1.shape
print r1

print r2.shape
print r2
这给了我以下结果:

(1, 4, 4)
[[[ 268.  229.  297.  305.]
  [ 256.  292.  322.  190.]
  [ 173.  240.  283.  243.]
  [ 291.  271.  302.  346.]]]
(1, 4, 4)
[[[ 247.  229.  291.  263.]
  [ 198.  297.  342.  233.]
  [ 208.  268.  268.  185.]
  [ 276.  272.  280.  372.]]]
我只想知道这是否是由于:

  • scipy中的一个bug(不太可能)
  • 我的程序中有错误(更有可能)
  • 我对重叠卷积的误解(很可能)
或上述任何组合。谢谢你的阅读

你写道:

。。。与此相同:

I -> 3x5x5 matrix
F -> 3x2x2 matrix
(I[0] * F[0]) + (I[1] * F[1]) + (I[2] * F[2]) -> 1x4x4 matrix
您忘记了卷积可以反转其中一个参数。因此,上述情况并非如此。相反,最后一行应该是:

(I[0] * F[2]) + (I[1] * F[1]) + (I[2] * F[0]) -> 1x4x4 matrix
比如说,

In [28]: r1 = np.sum([scipy.signal.convolve(x[i], w[2-i], 'valid') for i in range(3)], axis=0).reshape(1, 4, 4)

In [29]: r2 = scipy.signal.convolve(x, w, 'valid')

In [30]: r1
Out[30]: 
array([[[ 169.,  223.,  277.,  199.],
        [ 226.,  213.,  206.,  247.],
        [ 192.,  252.,  332.,  369.],
        [ 167.,  266.,  321.,  323.]]], dtype=float32)

In [31]: r2
Out[31]: 
array([[[ 169.,  223.,  277.,  199.],
        [ 226.,  213.,  206.,  247.],
        [ 192.,  252.,  332.,  369.],
        [ 167.,  266.,  321.,  323.]]], dtype=float32)
你写道:

。。。与此相同:

I -> 3x5x5 matrix
F -> 3x2x2 matrix
(I[0] * F[0]) + (I[1] * F[1]) + (I[2] * F[2]) -> 1x4x4 matrix
您忘记了卷积可以反转其中一个参数。因此,上述情况并非如此。相反,最后一行应该是:

(I[0] * F[2]) + (I[1] * F[1]) + (I[2] * F[0]) -> 1x4x4 matrix
比如说,

In [28]: r1 = np.sum([scipy.signal.convolve(x[i], w[2-i], 'valid') for i in range(3)], axis=0).reshape(1, 4, 4)

In [29]: r2 = scipy.signal.convolve(x, w, 'valid')

In [30]: r1
Out[30]: 
array([[[ 169.,  223.,  277.,  199.],
        [ 226.,  213.,  206.,  247.],
        [ 192.,  252.,  332.,  369.],
        [ 167.,  266.,  321.,  323.]]], dtype=float32)

In [31]: r2
Out[31]: 
array([[[ 169.,  223.,  277.,  199.],
        [ 226.,  213.,  206.,  247.],
        [ 192.,  252.,  332.,  369.],
        [ 167.,  266.,  321.,  323.]]], dtype=float32)

一个经典的Doh!片刻。非常感谢。一个经典的Doh!片刻。谢谢。