图像卷积的fft实现验证(python)

来源:互联网 发布:java timestamp 比较 编辑:程序博客网 时间:2024/06/06 02:17

1、Caffe的卷积操作时间主要在矩阵乘法,假设一个m*n卷积核,且输入通道数为1,输出特征图大小为h*w,则乘法个数m*n*h*w,这里的优化仅限于对矩阵的乘法优化,因此,只要选择适合的矩阵计算库就可以了。

2、若使用FFT来计算图像卷积。其主要步骤如下。

假设输入图像的大小为len=h*w,卷积核大小k_lenm*n;通常len>>k_len

  1. 对输入图像AFFT,其算法的时间复杂度为o(lenlglen)

  2. 对卷积核BFFT,但是由于卷积核与输入图像尺寸不一样,需要将卷积核扩展,即将卷积核倒置后,补len-k_len个0。

  3. AB傅里叶变换的结果相乘,即对应位相乘获得结果C。乘法个数为len,时间复杂度为o(len)

  4. CIFFT,得到结果D,在D中每隔k_len的值实部取出来,就是图像卷积的结果。因为图像卷积其实就是对应位相乘,所以需要每隔k_len取值,时间复杂度为o(len)

假设卷积核个数>1,需要对卷积核重新扩展后重复2)3)4)步骤,并与上一个卷积核图像卷积的值对应位相加就能获得。

验证正确性:

输入图像的卷积顺序-1,1,3,8 2,43,1,3 1,3,1,3 54,-2,-3,-1

卷积核1,2,-1,3

图像卷积结果:22,96,15,50.

此处注意,计算结果是用卷积核与输入图像进行乘法累加。

使用FFT结果:22,96,15,50

此处注意,将卷积核逆置。

结果正确



暂时未能看出此方法的优越性,从空间上看,需要对卷积核进行扩展,其空间大小与输入图像的尺寸大小一样。时间上分析,仅二者FFT对应相乘的时间的乘法个数就和矩阵乘法个数的数量级是一样的了(当len>>k_len时)。适用于卷积核尺寸较大的情景。



图2出处:https://core.ac.uk/download/pdf/24989291.pdf

虽然没理解为什么性能提升这么多,但是该论文所做的实验证明了FFT性能很好,虽然复杂度推导跟我推导的差不多~此论文用了cuFFT


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

至于多通道,多卷积核的,经python验证,卷积结果正确,其大概步骤如下:


水平有限,出错之处,希望得到各位的指正。


阅读全文
1 0