scipy.signal的卷积与计算结果不同
scipy.signal's convolve differs from calculated result
我想讨论一下应用于 CNN 和图像过滤的卷积...如果您有 RGB 图像(尺寸为 3xIxI
)和 K
过滤器,每个大小 3xFxF
,那么你最终会得到一个 Kx(I - F + 1)x(I - F + 1)
输出,假设你的步幅是 1
并且你只考虑完全重叠的区域(没有填充)。
从我读过的所有关于卷积的 material 中,你基本上是在图像上滑动每个过滤器,并在每个阶段计算大量的点积,然后将它们相加得到单一价值。
例如:
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 中的错误(不太可能)
- 我的程序有错误(更有可能)
- 我对重叠卷积的误解(很有可能)
或以上任意组合。感谢阅读!
您写道:
... the same as this:
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)
我想讨论一下应用于 CNN 和图像过滤的卷积...如果您有 RGB 图像(尺寸为 3xIxI
)和 K
过滤器,每个大小 3xFxF
,那么你最终会得到一个 Kx(I - F + 1)x(I - F + 1)
输出,假设你的步幅是 1
并且你只考虑完全重叠的区域(没有填充)。
从我读过的所有关于卷积的 material 中,你基本上是在图像上滑动每个过滤器,并在每个阶段计算大量的点积,然后将它们相加得到单一价值。
例如:
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 中的错误(不太可能)
- 我的程序有错误(更有可能)
- 我对重叠卷积的误解(很有可能)
或以上任意组合。感谢阅读!
您写道:
... the same as this:
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)