将卷积分解成更小的部分

信息处理 卷积
2022-01-29 03:22:48

对于一个项目,我需要进行卷积,并使用 gpu 进行计算。有时我必须处理 50x50 的内核大小,而这个大小的内核足够大,以至于它会阻塞 gpu。(gpu 没有足够的内存可用)我需要找到一种方法将内核分成更小的尺寸(8x8 或类似的)并以这种方式进行卷积(即一块一块然后缝合在一起),这样我就可以实现 gpu 增强. 将这些内核分成小块的最佳方法是什么?(我没有内核大小的先验知识,所以解决方案必须是我可以在运行时处理的东西。)

2个回答

是的,你可以把它们分开。卷积是一个线性过程,这意味着叠加成立。因此,您可以分解任何卷积核k分成多个部分(k1,k2,...kN) 使得k=ki.

例如,如果你有一个看起来像 [1 2 3 4] 的卷积核(当然这是一个愚蠢的核,但出于说明目的很好),你可以将它分解为以下核,[1 2 0 0 ] 和 [0 0 3 4]。现在,您可以像往常一样简单地进行卷积,然后将结果相加。总和将等于原始内核的卷积乘积。

但是,这样做在计算和内存方面都是低效的。相反,您可以简单地将 0 放在“子内核”的末尾,并使用 [1 2] 和 [3 4] 进行卷积。一个棘手的部分是您必须在将结果相加以获得正确答案之前抵消结果。

卷积操作是关联的。

(Sg)h=S(gh)

这意味着如果你找到两个内核g,h这样gh=k, (在哪里k是你的内核),你可以将你的内核分成几个部分,并单独应用每个部分。每个内核的大小可以更小。这种核的最著名的例子是高斯核。

有时,甚至可以将内核分成两部分,这样每一部分只在一个维度上工作。高斯核也具有这种品质。

总而言之,检查您的内核是否可以表示为两个较小内核的卷积。这可以通过检查矩阵的秩来发现。如果它等于1,它是可分离的。(那是因为所有的行都是第一行的线性组合)。