python pytorch fft_PyTorch中的傅立叶卷积:通过FFT有效计算大核卷积的数学原理和代码实现...

本文介绍了如何在PyTorch中使用傅立叶变换实现高效的卷积,特别是在处理大核卷积时。通过傅立叶卷积定理,可以将位置空间的卷积转换为频率空间的简单乘法,从而降低计算复杂度。作者详细解释了卷积定理,并提供了一个1D傅立叶卷积的PyTorch实现,证明了这种方法的准确性和速度优势。
摘要由CSDN通过智能技术生成

卷积

卷积在数据分析中无处不在。 几十年来,它们已用于信号和图像处理。 最近,它们已成为现代神经网络的重要组成部分。

在数学上,卷积表示为:

尽管离散卷积在计算应用程序中更为常见,但由于本文使用连续变量证明卷积定理(如下所述)要容易得多,因此在本文的大部分内容中,我将使用连续形式。 之后,我们将返回离散情况,并使用傅立叶变换在PyTorch中实现它。 离散卷积可以看作是连续卷积的近似值,其中连续函数在规则网格上离散化。 因此,我们不会为离散情况重新证明卷积定理。

卷积定理

在数学上,卷积定理可以表示为:

连续傅里叶变换的位置(最大归一化常数):

换句话说,位置空间的卷积等价于频率空间的直接乘法。这个想法是相当不直观的,但证明卷积定理是惊人的容易对于连续的情况。首先把方程的左边写出来。

现在改变积分的顺序,替换变量(x = y + z),并分离两个被积函数。

我们为什么要关心所有这些? 因为快速傅立叶变换的算法复杂度比卷积低。 直接卷积的复杂度为O(n²),因为我们将g中的每个元素传递给f中的每个元素。 快速傅立叶变换可以在O(n log n)的时间内计算出来。 当输入数组很大时,它们比卷积要快得多。 在这些情况下,我们可以使用卷积定理来计算频率空间中的卷积,然后执行傅立叶逆变换以返回到位置空间。

当输入较小时(例如3x3卷积内核),直接卷积仍然更快。 在机器学习应用程序中,使用较小的内核大小更为常见,因此PyTorch和Tensorflow之类的深度学习库仅提供直接卷积的实现。 但是,在现实世界中,有很多使用大内核的用例,其中傅立叶卷积更为有效。

PyTorch实现

现在,我将演示如何在PyTorch中实现傅立叶卷积函数。 它应该模仿torch.nn.functional.convNd的功能,并在实现中利用FFT,而无需用户做任何额外的工作。 这样,它应该接受三个张量(信号,内核和可选的偏差),并填充以应用于输入。 从概念上讲,此功能的内部工作原理是:

def fft_conv(

signal: Tensor, kernel: Tensor, bias: Tensor = None, padding: int = 0,

) -> Tensor:

# 1. Pad the input signal & kernel tensors

# 2. Compute FFT for both signal & kernel

# 3. Multi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值