我正在处理一个需要返回 M x的垂直(沿y轴)和水平卷积(沿x轴)的问题N个矩阵,带有内核,并将卷积结果分别存储到矩阵Dy和Dx中。内核 K为[-1,0,1] ,并且告诉我我的代码的速度是解决方案的3-4倍。我相信问题的目的是探索可分离的2D内核,以及当内核可分离以改善运行时如何将2D卷积转换为两个1D卷积。
主要目标是在垂直轴和水平轴上对带有核K的M x N矩阵进行卷积,并将结果分别存储在Dy和Dx中。有人告诉我以下代码太慢,我想知道如何才能使其更快。
def convolution2d(matrix, kernel):
m, n = kernel.shape #row and column of kernel
x, y = matrix.shape #row and column of matrix M
row = x - m + 1 #output row of resulted convol
col = y - n + 1 #output col of resulted convol
result = np.zeros((row,col), dtype = int)
for i in range(row):
for j in range(col):
result[i][j] = np.sum(matrix[i:i+m, j:j+n]*kernel)
return result
当我进行水平卷积时,我在矩阵M上使用核K = [-1,0,1],对于垂直卷积,我将K换位为[[-1],[0],[1]]以对矩阵进行卷积M.我想知道我是否误解了这个问题(即内核应该是1D而不是2D)还是使解决方案过于复杂(不需要转置/更改内核,使用相同的内核)并且根本不应该做conv2d。
由于无法使用CUDA或并行线程,因此我在线上进行了研究,但找不到关于如何优化解决方案的太多信息。我怀疑优化的解决方案可能涉及一维卷积而不是二维卷积,并希望确认。我感谢可以帮助我并帮助我理解我需要做的任何帮助和指导。