相当于最新 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)
我没有得到相同的结果。我错过了什么吗?
几个问题
- 您提供的
dim
参数类型无效,它应该是两个数字的元组或应该被省略。真的 PyTorch 应该引发异常。我会争辩说 运行 无一例外是 PyTorch 中的一个错误(我开了一张票说明了这一点)。
- 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 是一个视图,所以不应该以任何明显的方式减慢速度。
- PyTorch 不再提供在 RFFT 中禁用 one-sided 计算的选项。可能是因为禁用 one-sided 会使结果与
torch.fft.fft2
相同,这与 PEP 20 的第 13 条格言相冲突。提供特殊 real-valued 版本的 FFT 的全部意义在于你只需计算每个维度的一半值,因为其余部分可以通过 Hermition 对称 属性. 推断出来
所以从所有你应该能够使用的东西来看
fft_im = torch.view_as_real(torch.fft.fft2(img))
重要 如果您要将 fft_im
传递给 torch.fft
中的其他函数(例如 fft.ifft
或 fft.fftshift
) 那么您需要使用 torch.view_as_complex
转换回复数表示,这样这些函数就不会将最后一个维度解释为信号维度。
我想估计给定尺寸 BxCxWxH
在以前的火炬版本中,以下内容完成了这项工作:
fft_im = torch.rfft(img, signal_ndim=2, onesided=False)
并且输出的大小为:
BxCxWxHx2
但是,使用新版本的 rfft :
fft_im = torch.fft.rfft2(img, dim=2, norm=None)
我没有得到相同的结果。我错过了什么吗?
几个问题
- 您提供的
dim
参数类型无效,它应该是两个数字的元组或应该被省略。真的 PyTorch 应该引发异常。我会争辩说 运行 无一例外是 PyTorch 中的一个错误(我开了一张票说明了这一点)。 - PyTorch 现在 supports
complex
tensor types, so FFT functions return those instead of adding a new dimension for the real/imaginary parts. You can usetorch.view_as_real
转换为旧表示。另外值得指出的是,view_as_real
不会复制数据,因为它 returns 是一个视图,所以不应该以任何明显的方式减慢速度。 - PyTorch 不再提供在 RFFT 中禁用 one-sided 计算的选项。可能是因为禁用 one-sided 会使结果与
torch.fft.fft2
相同,这与 PEP 20 的第 13 条格言相冲突。提供特殊 real-valued 版本的 FFT 的全部意义在于你只需计算每个维度的一半值,因为其余部分可以通过 Hermition 对称 属性. 推断出来
所以从所有你应该能够使用的东西来看
fft_im = torch.view_as_real(torch.fft.fft2(img))
重要 如果您要将 fft_im
传递给 torch.fft
中的其他函数(例如 fft.ifft
或 fft.fftshift
) 那么您需要使用 torch.view_as_complex
转换回复数表示,这样这些函数就不会将最后一个维度解释为信号维度。