旧版中 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. SVM算法实现光学字符识别
  2. 基于Html5的爱情主题网站–表白神器(第二版)
  3. python教程书籍推荐-推荐几本对于Python初学者比较好的书籍(内含PDF)
  4. Android如何把 内容复制到剪贴板
  5. Android之走手机流量让电脑能上网几种方法
  6. C++中输入一组数字 以换行符结束输入
  7. spring boot集成mybatis+事务控制
  8. 使用mongoose 在 Node中操作MongoDB数据库
  9. reload vue 重新加载_vue面试,谈下router拦截
  10. push本地代码到github出错
  11. react hooks_如何破坏React Hooks的基础
  12. matlab出如何从fig中获取数据,如何从MATLAB的fig文件中提取原始数据?
  13. 未来教育计算机二级第一套ppt解析,计算机二级未来教育PPT部分答案
  14. 深入理解ArrayList 和 LinkedList 区别
  15. Datawhale数据挖掘项目之task1
  16. Android 还可以走多久?
  17. is_null,is_numeric
  18. 苹果关掉200m限制_苹果手机200m限制取消教程 苹果怎么下载超过200m的软件
  19. 使有用计算机不注意卫生,“十种举措”,远离干眼
  20. SQL Server 升序和降序排列

热门文章

  1. 2021/10/7-Shell脚本与工具
  2. PythonC++相互混合调用编程全面实战-13C++ 调用Python的环境准备和项目初始化
  3. go-pitaya学习笔记(10)-worker demo分析
  4. seata分布式事务项目中无法传递xid的问题
  5. 建设工程法规专科【10】
  6. 工作邦智慧水务营收系统
  7. 教学用计算机房活荷载,通信机房楼面等效均布活荷载课件.pdf
  8. 1311_硬件设计_ICT概念、应用以及优缺点学习小结
  9. java实现美颜相机
  10. 电商平台-深刻理解电商的库存架构与解决方案