提高沿轴的卷积速度

时间:2019-08-19 06:41:33

标签: python tensorflow machine-learning matrix convolution

我正在处理一个需要返回 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或并行线程,因此我在线上进行了研究,但找不到关于如何优化解决方案的太多信息。我怀疑优化的解决方案可能涉及一维卷积而不是二维卷积,并希望确认。我感谢可以帮助我并帮助我理解我需要做的任何帮助和指导。

0 个答案:

没有答案