旧版中 pytorch.rfft 函数与新版 pytorch.fft.rfft 函数对应修改问题

  • 前言
  • 一、旧版 pytorch.rfft()函数解释
  • 二、新版pytorch.fft.rfft()函数解释
  • 三、总结

前言

这两天整理谱池化操作,需要用到傅里叶变换这个函数。后来提升了pytorch的版本以后,发现之前的torch.rfft() 函数在新版的pytorch中使用会报错,后来查阅资料,发现是新版的参数有些变动。

pytorch旧版本(1.7之前)中有一个函数torch.rfft(),但是新版本(1.8、1.9)中被移除了,添加了torch.fft.rfft(),但它跟旧版的函数有了很大的变动,参数进行了一个大的调整。
傅里叶变换的整个过程我并没有搞的十分清晰,尤其是pytorch中的引用,网上对于这个函数解析的资料也十分有限,然后从知乎上参考了一篇文章,将我的问题解决了,感谢这位仁兄。


一、旧版 pytorch.rfft()函数解释

fft = torch.rfft(input, 2, normalized=True, onesided=False)
#  input 为输入的图片或者向量,dtype=torch.float32,size比如为[1,3,64,64]

参数说明:

input (Tensor) – the input tensor of at least signal_ndim dimensions
signal_ndim (int) – the number of dimensions in each signal. signal_ndim can only be 1, 2 or 3
normalized (bool, optional) – controls whether to return normalized results. Default: False
onesided (bool, optional) – controls whether to return half of results to avoid redundancy. Default: True
在上述的代码中,signal_ndim=2 因为图像是二维的,normalized=False 说明不进行归一化,onesided=False 则是希望不要减少最后一个维度的大小

在1.7版本torch.rfft中,有一个warning,表示在新版中,要“one-side ouput”的话用torch.fft.rfft(),要“two-side ouput”的话用torch.fft.fft()。这里的one/two side,跟旧版的onesided参数对应,所以我们要的是新版的torch.fft.fft()

需要注意的是,假设输入tensor的维度为 [N1,N2,,,,Nd][N_1,N_2,,,,N_d][N1​,N2​,,,,Nd​],则输出tensor的维度为 [N1,N2,,,,Nd,2][N_1,N_2,,,,N_d,2][N1​,N2​,,,,Nd​,2] 。最后一个维度2表示复数中的实部、虚部,即z=a+biz =a+biz=a+bi这样的复数,在旧版pytorch中表示为一个二维向量[a,b][a,b][a,b] 。

二、新版pytorch.fft.rfft()函数解释

新版官网解释

Getting started with the new torch.fft module is easy whether you are familiar with NumPy’s np.fft module or not. While complete documentation for each function in the module can be found here, a breakdown of what it offers is:

  • fft, which computes a complex FFT over a single dimension, and ifft, its inverse
  • the more general fftn and ifftn, which support multiple dimensions
  • The “real” FFT functions, rfft, irfft, rfftn, irfftn, designed to work with signals that are real-valued in their time domains
  • The “Hermitian” FFT functions, hfft and ihfft, designed to work with signals that are real-valued in their frequency domains
  • Helper functions, like fftfreq, rfftfreq, fftshift, ifftshift, that make it easier to manipulate signals

官网解释链接:https://pytorch.org/blog/the-torch.fft-module-accelerated-fast-fourier-transforms-with-autograd-in-pyTorch/

小结:可以看到这里也有rfft,官方文档说是用来处理都是实数的输入。但是它在前面的warning中说了是one-side,而我们要的是two-side。此外实数也可以看作是虚部都为0的复数,所以用fft没问题。
新版的rfft和fft都是用于一维输入,而我们的图像是二维,所以应该用rfft2和fft2。在fft2中,参数dim用来指定用于傅里叶变换的维度,默认(-2,-1),正好对应H、W两个维度。
新版所有的fft都不将复数 z=a+bjz=a+bjz=a+bj 存成二维向量了,而是一个数 [z=a+bj][z=a+bj][z=a+bj]。所以如果要跟旧版中一样存成二维向量,需要用.real()和.imag()提取复数的实部和虚部,然后用torch.stack()堆到一起,即可。


三、总结

代码变更对比如下:

import torch
input = torch.rand(1,3,32,32)# 旧版pytorch.rfft()函数
fft = torch.rfft(input, 2, normalized=True, onesided=False)# 新版 pytorch.fft.rfft2()函数
output = torch.fft.fft2(input, dim=(-2, -1))
output = torch.stack((output.real, output_new.imag), -1)

以上是我的理解,整体理解参考文章如下连接。

知乎:旧版pytorch中torch.rfft在新版本中的对应

旧版中 pytorch.rfft 函数与新版 pytorch.fft.rfft 函数对应修改问题相关推荐

  1. 微软强制移除旧版Edge后,已卸载新版Edge,要如何恢复

    微软强制移除旧版Edge后,已卸载新版Edge,要如何恢复 背景: 解决方式: 背景: 微软在4月的一次更新中强制的移除了旧版edge.对于一般已经更新新版的用户而言这没有什么影响.然而由于念旧我当初 ...

  2. Unity -- Animation(旧版动画组件)和Animator(新版动画器组件)

    旧版animation动画器组件 如果想让一个游戏物体具有动画表现的话,我们需要给这个游戏物体挂载动画组件 和音频组件视频组件一样,如果想在游戏对象上播放动画效果的话我们需要挂载一个动画组件,然后再给 ...

  3. java旧版下载地址_Java下载 - 最新版、历史版本的官方下载地址

    Java下载 - 最新版.历史版本的官方下载地址 2015-07-31·WeaponX 4114 次浏览 ## 最新版下载 ### 最新版Java下载地址 [http://www.oracle.com ...

  4. 新版opencv兼容旧版_【标准换版】关于家用和类似用途电器用外置电源适配器、充电器和内置开关电源产品认证执行新版标准的通知...

    各相关认证企业: GB4343.1-2018<家用电器.电动工具和类似器具的电磁兼容要求 第1部分:发射>标准(以下简称"新版标准")已发布,并将于2020年6月1日实 ...

  5. 五子棋新版已轻松战胜旧版

    随手下了两盘,都是新版战胜旧版. 旧版先手攻击性强些,新版与之久战不下:后手偏防守,棋力弱,很容易就被新版打败. 新版还有些问题,比如第一盘的62手应下在63手位置,这样就赢了.还要完善啊. 将绘制棋 ...

  6. xmind脑图解析为json,支持新版xmindzen、旧版xmind8

    xmindparser-java 项目地址 (https://github.com/liufree/xmindparser-java/) xmind解析为json,对象, 支持新版xmindzen,旧 ...

  7. python新旧特性过渡_网站改版时的一种新旧版过渡方案

    网站改版时,需要考虑一个周全的过渡方案,其中不容忽视的一点就是对旧版的处理问题.即使借助完美的数据迁移方案可以使新版从内容上完全取代旧版,但我们仍然不应该立即彻底废除掉旧版,因为: 1.网民有可能通过 ...

  8. 微软确认:从4月13日起,Win10系统将强制卸载旧版Edge浏览器

    在经过了一年多的运行测试之后,微软任务自己新开发的基于Chrome的浏览器Edge终于可堪重任,决定在Windows 10系统上全面启用,为了推动新一代浏览器Edge的全面普及,微软决定从2021年4 ...

  9. 如何解决ASP.NET网站更改后上传到IIS,看到的依然是旧版内容的问题

    如何解决ASP.NET网站更改后上传到IIS,看到的依然是旧版内容的问题 ASP.NET网站部分页面代码经过后期修改更新后,上传到IIS,在客户端浏览器看到的依然是旧版内容,登录到服务器在服务器本地浏 ...

最新文章

  1. JAVA目录树(全功能),Java+ajax实现
  2. IDEA 运行run 为灰色解决办法
  3. apche commons项目简介
  4. 最高的奖励 51Nod - 1163(贪心+并查集)
  5. python京东商品_Python爬取京东的商品分类与链接
  6. Apache常见配置及问题
  7. 1087 有多少不同的值 (20 分)—PAT (Basic Level) Practice (中文)
  8. 用了这个工具,我设计的PCB再也没出过问题
  9. 【UE编辑器怎么添加新的语法高亮】
  10. word论文排版插件_这是我见过最强大的Word插件!论文、报告、标书、规范全搞定...
  11. java 时间英文格式_Java SimpleDateFormat 中英文时间格式化转换
  12. RW文档翻译学习——RW-BT-SW-COMMON-FS
  13. 稀土配合物Ln(DBM)3(Cz-PBM)|Tb(DBM)3(Cz-PBM)|Gd(DBM)3(Cz-PBM)|Ir(L)2(DBM-Ox)Ir(L)2(DBM-Cz)qiyue
  14. 迅速处理多个ts转mp4格式 - 无需安装
  15. C#,ASP.NAT基于腾讯服务器实现自动发送邮件功能的几种方法及遇到的坑
  16. 网站推荐:快速查询 “中国传统配色” 的色值和色名
  17. python distance_to_Scipy: how to convert KD-Tree distance from query to kilometers (Python/Pandas)
  18. 常见物联网近距离无线通信技术解析
  19. Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
  20. Latex 的交叉引用

热门文章

  1. Python爬虫第一步之获取网页源代码
  2. 【原作者:byxdaz】Android系统介绍与框架
  3. c语言电子日历程序,c语言程序设计电子日历
  4. Python123练习【序列操作,程序控制结构】
  5. 学习cesium,关于图层界面的切换
  6. Cesium学习五:使用entity绘制cylinder
  7. English trip V2 - 3. A Healthy Diet Teacher:Corrine Key:各种前缀 im- un- in- re- over- under-
  8. GS5812B 封装SOT23-6 一款用于无线充电2A , 21V 600KHZ同步降压IC
  9. 《人人都是产品经理V2.0》读书笔记——第02章
  10. Python | 根据指定文件生成词云图