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

Equivalent to torch.rfft() in newest PyTorch version

我想估计给定尺寸 BxCxWxH

图像的傅里叶变换

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

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

并且输出的大小为:

BxCxWxHx2

但是,使用新版本的 rfft :

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

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

几个问题

  1. 您提供的dim参数类型无效,它应该是两个数字的元组或应该被省略。真的 PyTorch 应该引发异常。我会争辩说 运行 无一例外是 PyTorch 中的一个错误(我开了一张票说明了这一点)。
  2. PyTorch 现在 supports complex tensor types, so FFT functions return those instead of adding a new dimension for the real/imaginary parts. You can use torch.view_as_real 转换为旧表示。另外值得指出的是,view_as_real 不会复制数据,因为它 returns 是一个视图,所以不应该以任何明显的方式减慢速度。
  3. PyTorch 不再提供在 RFFT 中禁用 one-sided 计算的选项。可能是因为禁用 one-sided 会使结果与 torch.fft.fft2 相同,这与 PEP 20 的第 13 条格言相冲突。提供特殊 real-valued 版本的 FFT 的全部意义在于你只需计算每个维度的一半值,因为其余部分可以通过 Hermition 对称 属性.
  4. 推断出来

所以从所有你应该能够使用的东西来看

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

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