import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import signal
from typing import Tuple, List
import warnings
warnings.filterwarnings('ignore')
# 设置绘图样式
plt.style.use('seaborn-v0_8')
sns.set_palette("husl")
# 设置随机种子
torch.manual_seed(42)
np.random.seed(42)
# 检查GPU可用性
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f"使用设备: {device}")
print(f"PyTorch版本: {torch.__version__}")
Frequency-domain-deep-learning
频域深度学习入门教程
概述
这是一个用于在频域进行深度学习的入门教程,看完这个文档后,希望读者能够理解和掌握频域深度学习的核心概念、技术和应用。
📖 适用人群
🔧 主要技术
📝 目录
1. 理论基础
什么是频域?
时域(Time Domain): 信号随时间变化的表示方式。 频域(Frequency Domain): 信号的频率成分表示方式。
傅里叶变换(Fourier Transform)
傅里叶变换是将时域信号转换为频域信号的数学工具:
F(ω)=∫−∞∞f(t)e−iωtdt离散傅里叶变换(DFT): $ X_k = \sum_{n=0}^{N-1} x_n e^{-i2\pi kn/N} $
为什么要在频域做深度学习?
计算效率提高
例如,对于时域/空间域(后续统称时域)上的卷积操作,利用傅里叶变换的性质,可以通过在频域中的逐点乘法来实现。相较于在时域上使用卷积核进行卷积操作,利用FFT卷积会提高计算性能,可以将复杂度从 $O(k^2N^2)$ 降低至 $O(N·logN)$,卷积核越大,优势越明显。
具有全局感受野
时域网络,如 CNN / Transformer 的感受野较小,堆叠很多层后局部感受野才有可能达到全局感受野;而由于频域中的每个频率分量都包含整个时域信号的信息,因此,频域中的一次运算就可以达到影响时域信号全部范围的效果,使得 FNO 更适合捕获长程依赖和周期性的全局模式/周期性特征。FNO 在 PDE 求解中 4‒6 层即可达到比 30‒50 层 ResNet 更低的误差,且 网格无关(同一网络可推理 64×64 或 1024×1024)。
多尺度信息解耦
许多时域信号通过FFT转换后,具有稀疏性,以及明确的物理意义,高频对应局部细节(细纹理),低频对应全局结构(全局形状)。因此,在频域中,可按频段显式地剪枝、压缩或加权,而无需像时域中那样,设计膨胀卷积、U-Net skip 之类复杂结构等,例如:剪枝操作可以去掉不重要而保留重要的频率成分,从而提升计算效率。当使用一些压缩算法后,还能达到参数量锐减的效果。此外,信息解耦还有其他的效果,如:
一些扰动通常在时域表现为高频噪声,频域网络可在训练时直接 mask / 量化高频,天然对对抗扰动和 JPEG 量化更鲁棒(Fourier Adversarial Training)。
频谱加权损失可轻松让网络先学低频形状、后补高频细节(curriculum)。
正则化优化:添加L1正则迫使网络学习更紧凑的频域表示。
动态计算:根据输入特征自适应分配计算资源到关键频段。
物理一致性
对于很多科学计算(流体力学)问题,其边界本就是周期的;而频域天生满足周期假设或平移等变(平移等变性由卷积定理严格保证,不依赖近似),无需额外进行 padding 或 mask操作。
与物理傅里叶算子无缝衔接
在科学机器学习(SciML)中,很多 PDE 的解算子本身就是频域乘法(如 Poisson 方程、Helmholtz)。用频域网络逼近这些算子时,网络层与物理算子形式一致,误差更小、可解释性更强。
2. 环境设置和导入库
3. 基础频域变换
首先,让我们从基本的 FFT 操作开始,掌握如何在 PyTorch 中进行频域变换。
在对比中,若不将重构信号的实部提取出来(.real),PyTorch会自动将 实数张量 转换为 复数(虚部为0)后进行逐元素计算。 实际误差计算时通常取复数实部进行比较(需.real处理),否则会保留复数形式但虚部接近0(因数值精度误差)。
4. 频域信号分析与可视化
接下来,我们采用时域/频域可视化的方式来理解时域和频域之间的关系。首先,生成傅里叶变换后的频率坐标轴。
该频率坐标轴是绘制频域图(幅度谱/相位谱)的横坐标基础,对应FFT变换后的各个频率分量。具体来说:
当采样间隔d=1时,采样频率fs=1/d=1Hz。根据奈奎斯特采样定理,最大可表示频率为fs/2=0.5Hz。np.fft.fftfreq返回的归一化频率坐标范围是[-0.5, 0.5),其中: 正频率部分[0, 0.5)对应实际物理频率;负频率部分[-0.5, 0)是FFT对称性的数学表达。当采样率不是1时(如d=0.5),实际频率范围会按fs=1/d比例缩放。
子图分析
左上绘制了原始信号,横坐标是时间,纵坐标是幅值。曲线呈不规则的正弦-like 振荡,幅度在 -2 到 2 之间波动,有多个峰谷,表明多频率叠加。宏观感受就是,具有主周期(较慢波动)和高频抖动(噪声)。除此之外,通过观察,很难获取原始信号的其他信息。这时候,傅里叶变换就派上用场了,可以用它来揭示隐藏的频率模式。右上绘制了频域信号的幅度谱,横轴为频率 (Hz),纵轴为幅值。图中有一个高尖峰在低频(近0 Hz),然后迅速衰减到零,类似于指数衰减,且放眼望去,并没有明显的多个峰值,这表明信号主要是低频主导,或高频被噪声淹没。从图中可以看到,主峰在低频段( 0-20 Hz),表示信号能量集中在此,多个峰(如3Hz、7Hz、15Hz),它们对应原始信号的正弦成分。此外,幅度谱量化了每个频率的“强度”。在后续深度学习中,可以用于特征提取,例如FNO模型通过截断高频模式(modes)来高效计算。
接下来,在类中添加 2D 可视化方法:
在分析2D 频谱图时,最重要的是理解它代表了原始图像的频率成分分解。由于零频已移到中心,所以中心点代表了低频(全局/平滑特征),周围是高频(细节/噪声)。分析时,应先从图像中心出发,因为中心点(或小区域)对应零频率(DC term),表示原始图像的平均亮度或整体偏移。中心可以看作频谱的“锚点”,携带了最多能量(通常是最亮点)。如果中心过亮,可能表示图像有强低频偏置(如均匀背景);如果暗淡,则图像对比度高或有高频主导。接着,从中心向外扩展,检查径向分布,半径直接代表空间频率(spatial frequency)的幅度。低半径(20%)代表了低频区域,对应大尺度结构(如整体形状、渐变)。看是否有十字或斑点(表示方向性模式,如水平/垂直边缘);中等半径代表了中频区域(50%):对应纹理和中等细节;大半径代表了高频区域(100%):对应边缘、噪声或细微纹理。通常能量低、随机分布。如果有亮斑,可能表示周期性噪声。
此外,可以对二维图像进行x和y方向的分解可视化:
5. 频域深度学习模型
现在,让我们实现一个频域卷积模型。
6. 时空域vs频域对比
让我们通过实际例子来比较时域和频域方法的差异。
7. 实际应用案例
频域深度学习在实际问题中的应用:信号降噪。
8. 高级技巧与优化
在这一节中,我们将介绍一些高级的频域深度学习技巧。
这里实现了一个通过可学习的阈值和权重参数,实现动态的、数据驱动的频率双重调控机制,相比固定滤波器能更好地适应不同任务需求。这样的好处有两个,首先可以引入结构先验, 阈值参数提供了频率分界点的初始假设(如0.1对应低频),通过sigmoid的陡峭系数(10)形成明确的保留/抑制区划分。这为模型提供了物理意义明确的频率选择先验,比纯权重学习收敛更快;其次,提供了解耦不同维度的控制,阈值控制频率选择的宏观范围(选择哪些频段),权重控制微观调整(选中频段内的相对重要性)。这种解耦使网络可以分别优化频率选择的整体策略和局部调整。这种设计类似于CNN中同时使用卷积核(局部特征提取)和注意力机制(特征重要性调整)的互补思路。
接下来将介绍频域损失函数。该损失函数具有特征解耦的特点,采用时域损失和频域损失双管齐下的特点,时域损失主要用于捕捉整体波形差异,频域损失用于独立优化幅度(能量分布)和相位(时序关系)这两个正交特征。在物理意义上,也能解释它的优点,许多实际应用中,人类感知对频域特征更敏感(如特定频率成分的保留),把信号高频部分整体衰减 10 %,时域上的逐点差异可能很小,人耳/人眼却会立刻注意到“闷”或“糊”,频域损失会直接惩罚这种频带能量错误,而 时域对此不敏感。;此外,当一些任务涉及频域特性时(如去噪需保持干净频率成分),或者频域特征对任务至关重要时,纯时域损失可能无法有效传递梯度到频域相关参数,采用这种混合损失能显著提升模型表现。
还可以从相位偏差、能量分布偏差和跨尺度误差入手。一个纯正弦向前平移几个采样点,时域 MSE 立即变大,但在频域里仅仅表现为 phase 变化、幅度不变。仅用时域损失会把“轻微时移”当成巨大误差,模型会花力气去拟合这种其实无关紧要的位移;而频域损失能告诉网络“形状对了,只是时间没对齐”,从而避免过拟合局部时移。时域 MSE 把每个采样点权重等同,10 kHz 误差和 100 Hz 误差被平等对待;频域损失天然按频段归一化,更容易让网络在不同尺度上均衡学习。
🌟 进阶学习
📝 贡献和反馈
如果您有任何建议或发现问题,欢迎: