二维卷积作为矩阵矩阵乘法
conv-neural-network
convolution
deep-learning
neural-network
4
0

我知道的是,在一维情况下,两个矢量之间的卷积ab ,可以被计算为conv(a, b)也可作为在之间的乘积T_ab ,其中T_a是用于对应的托普利兹矩阵a

是否可以将此想法扩展到2D?

给定a = [5 1 3; 1 1 2; 2 1 3]b=[4 3; 1 2] ,是否可以像一维情况一样在Toeplitz矩阵中转换a并计算T_ab之间的矩阵矩阵乘积?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

如果将k解开为am ^ 2向量并解开X,则将得到:

  • 一个m**2向量k
  • 一个((nm)**2, m**2)矩阵unrolled_X

可以通过以下Python代码获取unrolled_X

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

与每个X展开相反,展开X而不展开k可以得到更紧凑的表示形式(更小的矩阵)-但是您需要展开每个X。根据您想做什么,您可能更喜欢展开k。

在这里, unrolled_X不是稀疏的,而unrolled_k是稀疏的,而是大小((n-m+1)^2,n^2)如@Salvador Dali所提到的。

展开k可以像这样完成:

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
收藏
评论

1-定义输入和过滤

为输入信号,设F为滤波器或内核。

2D输入信号和滤波器

2-计算最终输出大小

如果I为m1 x n1 ,F为m2 x n2,则输出大小为:

在此处输入图片说明

3-零填充滤波器矩阵

对滤波器进行零填充,使其与输出大小相同。

在此处输入图片说明

4-为零填充过滤器的每一行创建Toeplitz矩阵

在此处输入图片说明

5-创建一个双重阻塞的Toeplitz矩阵

现在,所有这些小的Toeplitz矩阵都应布置在一个大双倍阻塞的Toeplitz矩阵中。 在此处输入图片说明

在此处输入图片说明

6-将输入矩阵转换为列向量

在此处输入图片说明

7-将双阻塞的Toeplitz矩阵与矢量化的输入信号相乘

该乘法给出卷积结果。

8-最后一步:将结果重塑为矩阵形式

在此处输入图片说明

有关更多详细信息和python代码,请查看我的github存储库:

使用python中的toeplitz矩阵逐步解释为实现为矩阵乘法的2D卷积

收藏
评论

是的,这是可能的,并且您还应该使用双块循环矩阵(这是Toeplitz矩阵的特例)。我将为您提供一个示例,该示例的内核和输入较小,但是可以为任何内核构造Toeplitz矩阵。因此,您具有2d输入x和2d内核k并且要计算卷积x * k 。还要假设k已经被翻转了。我们还假设x的大小为n×nk的大小为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来获得相同的结果。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号