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

Equivalent to torch.rfft() in newest PyTorch version

提问人:singa1994 提问时间:3/17/2022 更新时间:3/18/2022 访问量:3472

问:

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

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

fft_im = torch.rfft(img, signal_ndim=2, onesided=False)

输出的大小是:

BxCxWxHx2

但是,使用新版本的 rfft :

fft_im = torch.fft.rfft2(img, dim=2, norm=None)

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

Python 深度学习 PyTorch FFT

评论


答:

6赞 jodag 3/18/2022 #1

几个问题

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

因此,从您应该能够使用的所有内容中

fft_im = torch.view_as_real(torch.fft.fft2(img))

重要如果要传递给 (like or ) 中的其他函数,则需要使用 torch.view_as_complex 转换回复数表示,以便这些函数不会将最后一个维度解释为信号维度。fft_imtorch.fftfft.ifftfft.fftshift

评论

0赞 singa1994 3/18/2022
谢谢你的回答。按照您的解决方案,我仍然没有得到预期的 BxCxHxWx2 结果。我宁愿得到一个输出维度 BxCxHx(w/2)。
0赞 jodag 3/18/2022
@singa1994我仔细研究了你的问题,发现我错过了一些部分。重写了答案,希望这会有所帮助。