我知道,在一维情况下,向量a
与b
的卷积可以通过conv(a, b)
或者是对应的Toeplitz矩阵T_a
和b
的乘积来计算。
但是这个方法可以扩展到二维吗?
如果给定a = [5 1 3; 1 1 2; 2 1 3]
和b=[4 3; 1 2]
,是否可以将a
转换为Toeplitz矩阵,并像在一维情况下那样计算T_a
和b
的矩阵乘积呢?
我知道,在一维情况下,向量a
与b
的卷积可以通过conv(a, b)
或者是对应的Toeplitz矩阵T_a
和b
的乘积来计算。
但是这个方法可以扩展到二维吗?
如果给定a = [5 1 3; 1 1 2; 2 1 3]
和b=[4 3; 1 2]
,是否可以将a
转换为Toeplitz矩阵,并像在一维情况下那样计算T_a
和b
的矩阵乘积呢?
是的,这是可能的,您还应该使用双重循环块状矩阵(这是Toeplitz矩阵的一个特殊情况)。我将为您提供具有小内核和输入大小的示例,但是对于任何内核都可以构造Toeplitz矩阵。因此,您有一个2D输入x
和2D内核k
,并且要计算卷积x * k
。还假设k
已经被翻转。同时也假设x
的大小为n×n
,k
的大小为m×m
。
然后您将k
展开成一个大小为(n-m+1)^2 × n^2
的稀疏矩阵,并将x
展开成一个长向量n^2 × 1
。您计算这个稀疏矩阵与向量的乘积,并将结果向量(其大小将为(n-m+1)^2 × 1
)转换为一个n-m+1
的方阵。
我相信仅凭阅读很难理解。因此,这里有一个针对2×2内核和3×3输入的示例。
这是用向量构建的矩阵:
如果在 x
上使用大小为 k
的滑动窗口,也会得到同样的结果。
k
应该如何展开成稀疏矩阵? - user76284设I为输入信号,F为滤波器或卷积核。
如果 I 是 m1 x n1,F 是 m2 x n2,则输出的尺寸将为:
将滤波器填充为零,使其与输出大小相同。
现在,所有这些小的Toeplitz矩阵应该被排列在一个大的双重阻塞Toeplitz矩阵中。
这个乘积给出了卷积结果。
欲了解更多细节和Python代码,请查看我的GitHub存储库:
from numpy import zeros
def unroll_matrix(X, m):
flat_X = X.flatten()
n = X.shape[0]
unrolled_X = zeros(((n - m) ** 2, m**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and ((i / n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_X[i - skipped, j * m + l] = flat_X[i + j * n + l]
else:
skipped += 1
return unrolled_X
from scipy.sparse import lil_matrix
from numpy import zeros
import scipy
def unroll_kernel(kernel, n, sparse=True):
m = kernel.shape[0]
if sparse:
unrolled_K = lil_matrix(((n - m)**2, n**2))
else:
unrolled_K = zeros(((n - m)**2, n**2))
skipped = 0
for i in range(n ** 2):
if (i % n) < n - m and((i / n) % n) < n - m:
for j in range(m):
for l in range(m):
unrolled_K[i - skipped, i + j * n + l] = kernel[j, l]
else:
skipped += 1
return unrolled_K
def unfold_matrix(X, k):
n, m = X.shape[0:2]
xx = zeros(((n - k + 1) * (m - k + 1), k**2))
row_num = 0
def make_row(x):
return x.flatten()
for i in range(n- k+ 1):
for j in range(m - k + 1):
#collect block of m*m elements and convert to row
xx[row_num,:] = make_row(X[i:i+k, j:j+k])
row_num = row_num + 1
return xx
deep-learning
[标签信息](https://stackoverflow.com/tags/deep-learning/info)中的介绍和注意事项。 - desertnaut