相当于最新 PyTorch 版本中的 torch.rfft()

Bil*_*Kid 4 python fft deep-learning pytorch

我想估计给定尺寸图像的傅里叶变换BxCxWxH

在以前的火炬版本中,以下内容完成了这项工作:

fft_im = torch.rfft(img, signal_ndim=2, onesided=False)
Run Code Online (Sandbox Code Playgroud)

输出的大小为:

BxCxWxHx2
Run Code Online (Sandbox Code Playgroud)

但是,使用新版本的 rfft :

fft_im = torch.fft.rfft2(img, dim=2, norm=None)
Run Code Online (Sandbox Code Playgroud)

我没有得到相同的结果。我错过了什么吗?

jod*_*dag 6

几个问题

  1. 您提供的参数dim是无效类型,它应该是两个数字的元组或者应该被省略。实际上 PyTorch 应该引发异常。我认为这无一例外地运行的事实是 PyTorch 中的一个错误(我开了一张票,说明了这一点)。
  2. PyTorch 现在支持complex张量类型,因此 FFT 函数返回这些类型,而不是为实部/虚部添加新维度。您可以使用torch.view_as_real转换为旧的表示形式。还值得指出的是,它view_as_real不会复制数据,因为它返回一个视图,因此不应以任何明显的方式减慢速度。
  3. PyTorch 不再提供禁用 RFFT 中单边计算的选项。可能是因为禁用 one-side 会使结果与 相同torch.fft.fft2,这与 PEP 20 的第 13 条格言相冲突。提供 FFT 的特殊实值版本的全部意义在于,您只需要计算每个维度的一半值,因为其余部分可以通过 Hermition 对称性质推断出来。

所以从所有你应该能够使用的

fft_im = torch.view_as_real(torch.fft.fft2(img))
Run Code Online (Sandbox Code Playgroud)

重要如果您要传递给(例如或)fft_im中的其他函数,那么您需要使用 转换回复杂表示,以便这些函数不会将最后一个维度解释为信号维度。torch.fftfft.ifftfft.fftshifttorch.view_as_complex