Skip to content

Commit 648639e

Browse files
committed
Merge branch 'dev_model' of https://github.com/Nolan-149/PaddleScience into dev_model
2 parents 256afa1 + 3790628 commit 648639e

File tree

19 files changed

+1529
-78
lines changed

19 files changed

+1529
-78
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ PaddleScience 是一个基于深度学习框架 PaddlePaddle 开发的科学计
124124
| 天气预报 | [FengWu 气象预报](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/fengwu) | 数据驱动 | Transformer | 监督学习 | - | [Paper](https://arxiv.org/pdf/2304.02948) |
125125
| 天气预报 | [Pangu-Weather 气象预报](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/pangu_weather) | 数据驱动 | Transformer | 监督学习 | - | [Paper](https://arxiv.org/pdf/2211.02556) |
126126
| 大气污染物 | [UNet 污染物扩散](https://aistudio.baidu.com/projectdetail/5663515?channel=0&channelType=0&sUid=438690&shared=1&ts=1698221963752) | 数据驱动 | UNet | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/198102) | - |
127+
| 大气污染物 | [STAFNet 污染物浓度预测](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/stafnet) | 数据驱动 | STAFNet | 监督学习 | [Data](https://quotsoft.net/air) | [Paper](https://link.springer.com/chapter/10.1007/978-3-031-78186-5_22) |
127128
| 天气预报 | [DGMR 气象预报](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/dgmr.md) | 数据驱动 | GAN | 监督学习 | [UK dataset](https://huggingface.co/datasets/openclimatefix/nimrod-uk-1km) | [Paper](https://arxiv.org/pdf/2104.00954.pdf) |
128129
| 地震波形反演 | [VelocityGAN 地震波形反演](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/velocity_gan.md) | 数据驱动 | VelocityGAN | 监督学习 | [OpenFWI](https://openfwi-lanl.github.io/docs/data.html#vel) | [Paper](https://arxiv.org/abs/1809.10262v6) |
129130
| 交通预测 | [TGCN 交通流量预测](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/tgcn.md) | 数据驱动 | GCN & CNN | 监督学习 | [PEMSD4 & PEMSD8](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tgcn/tgcn_data.zip) | - |
@@ -150,7 +151,7 @@ PaddleScience 是一个基于深度学习框架 PaddlePaddle 开发的科学计
150151
<!-- --8<-- [start:feature] -->
151152
## ✨特性
152153

153-
- **支持自动化并行实验调度,一键串/并行启动实验任务([教程](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/user_guide/#113))**,提高科研效率。
154+
- 支持 **[实验源码跟踪](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/user_guide/#112)[一键启动并行实验](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/user_guide/#114)**,提高科研效率。
154155
- 支持简单几何和复杂 STL 几何的采样与布尔运算。
155156
- 支持包括 Dirichlet、Neumann、Robin 以及自定义边界条件。
156157
- 支持物理机理驱动、数据驱动、数理融合三种问题求解方式。涵盖流体、结构、气象等领域 20+ 案例。

docs/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@
156156
| 天气预报 | [FengWu 气象预报](./zh/examples/fengwu.md) | 数据驱动 | Transformer | 监督学习 | - | [Paper](https://arxiv.org/pdf/2304.02948) |
157157
| 天气预报 | [Pangu-Weather 气象预报](./zh/examples/pangu_weather.md) | 数据驱动 | Transformer | 监督学习 | - | [Paper](https://arxiv.org/pdf/2211.02556) |
158158
| 大气污染物 | [UNet 污染物扩散](https://aistudio.baidu.com/projectdetail/5663515?channel=0&channelType=0&sUid=438690&shared=1&ts=1698221963752) | 数据驱动 | UNet | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/198102) | - |
159+
| 大气污染物 | [STAFNet 污染物浓度预测](./zh/examples/stafnet.md) | 数据驱动 | STAFNet | 监督学习 | [Data](https://quotsoft.net/air) | [Paper](https://link.springer.com/chapter/10.1007/978-3-031-78186-5_22) |
159160
| 天气预报 | [DGMR 气象预报](./zh/examples/dgmr.md) | 数据驱动 | GAN | 监督学习 | [UK dataset](https://huggingface.co/datasets/openclimatefix/nimrod-uk-1km) | [Paper](https://arxiv.org/pdf/2104.00954.pdf) |
160161
| 地震波形反演 | [VelocityGAN 地震波形反演](./zh/examples/velocity_gan.md) | 数据驱动 | VelocityGAN | 监督学习 | [OpenFWI](https://openfwi-lanl.github.io/docs/data.html#vel) | [Paper](https://arxiv.org/abs/1809.10262v6) |
161162
| 交通预测 | [TGCN 交通流量预测](./zh/examples/tgcn.md) | 数据驱动 | GCN & CNN | 监督学习 | [PEMSD4 & PEMSD8](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tgcn/tgcn_data.zip) | - |

docs/zh/api/arch.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
- NowcastNet
3030
- SFNONet
3131
- SPINN
32+
- STAFNet
3233
- TFNO1dNet
3334
- TFNO2dNet
3435
- TFNO3dNet

docs/zh/api/data/dataset.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@
3535
- DrivAerNetDataset
3636
- DrivAerNetPlusPlusDataset
3737
- IFMMoeDataset
38+
- STAFNetDataset
3839
show_root_heading: true

docs/zh/examples/stafnet.md

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# STAFNet: Spatiotemporal-Aware Fusion Network for Air Quality Prediction
2+
3+
| 预训练模型 | 指标 |
4+
| ------------------------------------------------------------ | -------------------- |
5+
| [stafnet.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/stafnet/stafnet.pdparams) | MAE(1-48h) : 8.70933 |
6+
7+
=== "模型训练命令"
8+
9+
``` sh
10+
python stafnet.py DATASET.data_dir="Your train dataset path" EVAL.eval_data_path="Your evaluate dataset path"
11+
```
12+
13+
=== "模型评估命令"
14+
15+
``` sh
16+
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/stafnet/val_data.pkl -P ./dataset/
17+
python stafnet.py mode=eval EVAL.pretrained_model_path="https://paddle-org.bj.bcebos.com/paddlescience/models/stafnet/stafnet.pdparams"
18+
```
19+
20+
## 1. 背景介绍
21+
22+
近些年,全球城市化和工业化不可避免地导致了严重的空气污染问题。心脏病、哮喘和肺癌等非传染性疾病的高发与暴露于空气污染直接相关。因此,空气质量预测已成为公共卫生、国民经济和城市管理的研究热点。目前已经建立了大量监测站来监测空气质量,并将其地理位置和历史观测数据合并为时空数据。然而,由于空气污染形成和扩散的高度复杂性,空气质量预测仍然面临着一些挑战。
23+
24+
首先,空气中污染物的排放和扩散会导致邻近地区的空气质量迅速恶化,这一现象在托布勒地理第一定律中被描述为空间依赖关系,建立空间关系模型对于预测空气质量至关重要。然而,由于空气监测站的地理分布稀疏,要捕捉数据中内在的空间关联具有挑战性。其次,空气质量受到多源复杂因素的影响,尤其是气象条件。例如,长时间的小风或静风会抑制空气污染物的扩散,而自然降雨则在清除和冲刷空气污染物方面发挥作用。然而,空气质量站和气象站位于不同区域,导致多模态特征不对齐。融合不对齐的多模态特征并获取互补信息以准确预测空气质量是另一个挑战。最后但并非最不重要的一点是,空气质量的变化具有明显的多周期性特征。利用这一特点对提高空气质量预测的准确性非常重要,但也具有挑战性。
25+
26+
针对空气质量预测提出了许多研究。早期的方法侧重于学习单个观测站观测数据的时间模式,而放弃了观测站之间的空间关系。最近,由于图神经网络(GNN)在处理非欧几里得图结构方面的有效性,越来越多的方法采用 GNN 来模拟空间依赖关系。这些方法将车站位置作为上下文特征,隐含地建立空间依赖关系模型,没有充分利用车站位置和车站之间关系所包含的宝贵空间信息。此外,现有的时空 GNN 缺乏在错位图中融合多个特征的能力。因此,大多数方法都需要额外的插值算法,以便在早期阶段将气象特征与 AQ 特征进行对齐和连接。这种方法消除了空气质量站和气象站之间的空间和结构信息,还可能引入噪声导致误差累积。此外,在空气质量预测中利用多周期性的问题仍未得到探索。
27+
28+
该案例研究时空图网络在空气质量预测方向上的应用。
29+
30+
## 2. 模型原理
31+
32+
STAFNet是一个新颖的多模式预报框架--时空感知融合网络来预测空气质量。STAFNet 由三个主要部分组成:空间感知 GNN、跨图融合关注机制和 TimesNet 。具体来说,为了捕捉各站点之间的空间关系,我们首先引入了空间感知 GNN,将空间信息明确纳入信息传递和节点表示中。为了全面表示气象影响,我们随后提出了一种基于交叉图融合关注机制的多模态融合策略,在不同类型站点的数量和位置不一致的情况下,将气象数据整合到 AQ 数据中。受多周期分析的启发,我们采用 TimesNet 将时间序列数据分解为不同频率的周期信号,并分别提取时间特征。
33+
34+
本章节仅对 STAFNet的模型原理进行简单地介绍,详细的理论推导请阅读 STAFNet: Spatiotemporal-Aware Fusion Network for Air Quality Prediction
35+
36+
模型的总体结构如图所示:
37+
38+
![image-20240530165151443](https://paddle-org.bj.bcebos.com/paddlescience/docs/stafnet/model.jpg)
39+
40+
<div align = "center">STAFNet网络模型</div>
41+
42+
STAFNet 包含三个模块,分别将空间信息、气象信息和历史信息融合到空气质量特征表征中。首先模型的输入:过去T个时刻的**空气质量**数据和**气象**数据,使用两个空间感知 GNN(SAGNN),利用监测站之间的空间关系分别提取空气质量和气象信息。然后,跨图融合注意(CGF)将气象信息融合到空气质量表征中。最后,我们采用 TimesNet 模型来描述空气质量序列的时间动态,并生成多步骤预测。这一推理过程可表述如下,
43+
44+
![image-20240531173333183](https://paddle-org.bj.bcebos.com/paddlescience/docs/stafnet/Equation.jpg)
45+
46+
## 3. 模型构建
47+
48+
### 3.1 数据集介绍
49+
50+
数据集采用了STAFNet处理好的北京空气质量数据集。数据集都包含:
51+
52+
(1)空气质量观测值(即 PM2.5、PM10、O3、NO2、SO2 和 CO);
53+
54+
(2)气象观测值(即温度、气压、湿度、风速和风向);
55+
56+
(3)站点位置(即经度和纬度)。
57+
58+
所有空气质量和气象观测数据每小时记录一次。数据集的收集时间为 2021 年 1 月 24 日至 2023 年 1 月 19 日,按 9:1的比例将数据分为训练集和测试集。空气质量观测数据来自国家城市空气质量实时发布平台,气象观测数据来自中国气象局。数据集的具体细节如下表所示:
59+
60+
<div> <!--块级封装--> <center> <!--将图片和文字居中--> <img src="https://paddle-org.bj.bcebos.com/paddlescience/docs/stafnet/dataset.jpg" alt="image-20240530104042194" style="zoom: 25%;" /> <br> <!--换行--> 北京空气质量数据集 <!--标题--> </center> </div>
61+
62+
具体的数据集可从https://quotsoft.net/air/下载。
63+
64+
运行本问题代码前请下载[数据集](https://paddle-org.bj.bcebos.com/paddlescience/datasets/stafnet/val_data.pkl), 下载后分别存放在路径:
65+
66+
```
67+
./dataset
68+
```
69+
70+
### 3.2 模型搭建
71+
72+
在STAFNet模型中,输入过去72小时35个站点的空气质量数据,预测这35个站点未来48小时的空气质量。在本问题中,我们使用神经网络 `stafnet` 作为模型,其接收图结构数据,输出预测结果。
73+
74+
```py linenums="10" title="examples/stafnet/stafnet.py"
75+
--8<--
76+
examples/stafnet/stafnet.py:10:10
77+
--8<--
78+
```
79+
80+
### 3.3 参数和超参数设定
81+
82+
其中超参数`cfg.MODEL.gat_hidden_dim``cfg.MODEL.e_layers``cfg.MODEL.d_model``cfg.MODEL.top_k`等默认设定如下:
83+
84+
``` yaml linenums="35" title="examples/stafnet/conf/stafnet.yaml"
85+
--8<--
86+
examples/stafnet/conf/stafnet.yaml:35:59
87+
--8<--
88+
```
89+
90+
### 3.4 优化器构建
91+
92+
训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器。
93+
94+
``` py linenums="62" title="examples/stafnet/stafnet.py"
95+
--8<--
96+
examples/stafnet/stafnet.py:62:62
97+
--8<--
98+
```
99+
100+
其中学习率相关的设定如下:
101+
102+
``` yaml linenums="70" title="examples/stafnet/conf/stafnet.yaml"
103+
--8<--
104+
examples/stafnet/conf/stafnet.yaml:70:75
105+
--8<--
106+
```
107+
108+
### 3.5 约束构建
109+
110+
在本案例中,我们使用监督数据集对模型进行训练,因此需要构建监督约束。
111+
112+
在定义约束之前,我们需要指定数据集的路径等相关配置,将这些信息存放到对应的 YAML 文件中,如下所示。
113+
114+
``` yaml linenums="31" title="examples/stafnet/conf/stafnet.yaml"
115+
--8<--
116+
examples/stafnet/conf/stafnet.yaml:31:34
117+
--8<--
118+
```
119+
120+
最后构建监督约束,如下所示。
121+
122+
``` py linenums="46" title="examples/stafnet/stafnet.py"
123+
--8<--
124+
examples/stafnet/stafnet.py:46:51
125+
--8<--
126+
```
127+
128+
### 3.6 评估器构建
129+
130+
在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.SupervisedValidator` 构建评估器,构建过程与 [约束构建 3.5](https://github.com/PaddlePaddle/PaddleScience/blob/develop/docs/zh/examples/stafnet.md#36) 类似,只需把数据目录改为测试集的目录,并在配置文件中设置 `EVAL.batch_size=1` 即可。
131+
132+
``` py linenums="52" title="examples/stafnet/stafnet.py"
133+
--8<--
134+
examples/stafnet/stafnet.py:52:58
135+
--8<--
136+
```
137+
138+
评估指标为预测结果和真实结果的MAE 值,因此使用PaddleScience内置的`ppsci.metric.MAE()`,如下所示。
139+
140+
``` py linenums="55" title="examples/stafnet/stafnet.py"
141+
--8<--
142+
examples/stafnet/stafnet.py:55:55
143+
--8<--
144+
```
145+
146+
### 3.7 模型训练
147+
148+
由于本问题为时序预测问题,因此可以使用PaddleScience内置的`psci.loss.MAELoss('mean')`作为训练过程的损失函数。同时选择使用随机梯度下降法对网络进行优化。完成述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练。具体代码如下:
149+
150+
``` py linenums="66" title="examples/stafnet/stafnet.py"
151+
--8<--
152+
examples/stafnet/stafnet.py:66:82
153+
--8<--
154+
```
155+
156+
## 4. 完整代码
157+
158+
```py linenums="1" title="examples/stafnet/stafnet.py"
159+
--8<--
160+
examples/stafnet/stafnet.py
161+
--8<--
162+
```
163+
164+
## 5. 参考资料
165+
166+
- [STAFNet: Spatiotemporal-Aware Fusion Network for Air Quality Prediction](https://link.springer.com/chapter/10.1007/978-3-031-78186-5_22)

docs/zh/user_guide.md

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,52 @@ EVAL:
4545
sup_validator: 128
4646
```
4747

48-
#### 1.1.2 命令行方式配置参数
48+
#### 1.1.2 保存实验代码快照⭐
49+
50+
尽管我们提供了以 hydra 和 Omegaconf 为基础的运行配置系统,但除了配置文件外还可能会涉及修改源代码,这同样会导致实验代码版本混乱,难以追踪。
51+
52+
为了解决这一问题,PaddleScience 提供了代码差异跟踪功能,通过在运行命令的末尾加上:`trace=True`,就能够自动将当前代码快照保存到 `output_dir/code_snapshot/uncommitted.diff` 文件中,便于后续追踪和复现。
53+
54+
`allen_cahn_piratenet.py` 为例,首先确认 Python 环境中安装了 GitPython 包
55+
56+
``` sh
57+
python -m pip install GitPython
58+
```
59+
60+
然后在运行命令的末尾加上 `trace=True` 参数
61+
62+
``` sh
63+
python allen_cahn_piratenet.py {++trace=True++}
64+
```
65+
66+
则其打印的日志如下
67+
68+
``` log hl_lines="1-9"
69+
ppsci MESSAGE: [Code Trace] Git Information:
70+
ppsci MESSAGE: Branch : support_code_trace
71+
ppsci MESSAGE: Commit : 5ea90ae584b7fff17ff5aa385ba5abb6c04c268c
72+
ppsci MESSAGE: Date : 2025-06-24T20:48:07+08:00
73+
ppsci MESSAGE: Dirty : True
74+
ppsci INFO: [Code Trace] Staged changes saved to: outputs_allen_cahn_piratenet/2025-07-02/20-13-46/code_snapshot/staged.diff
75+
ppsci INFO: [Code Trace] To restore your code to this staged version, run: git apply outputs_allen_cahn_piratenet/2025-07-02/20-13-46/code_snapshot/staged.diff
76+
ppsci INFO: [Code Trace] Unstaged changes saved to: outputs_allen_cahn_piratenet/2025-07-02/20-13-46/code_snapshot/unstaged.diff
77+
ppsci INFO: [Code Trace] To restore your code to this unstaged version, run: git apply outputs_allen_cahn_piratenet/2025-07-02/20-13-46/code_snapshot/unstaged.diff
78+
W0702 20:13:46.390472 37150 gpu_resources.cc:114] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 12.0, Runtime API Version: 11.6
79+
ppsci MESSAGE: 'shuffle' and 'drop_last' are both set to False in default as sampler config is not specified.
80+
ppsci INFO: Auto collation is disabled and set num_workers to 0 to speed up batch sampling.
81+
ppsci INFO: Using paddlepaddle develop(f701bb1) on device Place(gpu:0)
82+
ppsci MESSAGE: Set to_static=False for computational optimization.
83+
...
84+
```
85+
86+
启用该功能后,系统将在日志中记录更详细的代码版本信息,并自动将当前代码的修改差异快照保存至 `output_dir/code_snapshot/*.diff`。在有需要时可使用 `git apply` 命令,将代码恢复至对应快照时的状态。
87+
88+
!!! warning "注意事项"
89+
90+
- 如果需要跟踪新增文件,需先使用 `git add` 将新增文件添加到暂存区后才能被跟踪。
91+
- 使用本功能需确保当前开发的代码库为 git 仓库,且当前代码库中存在 `.git` 文件夹,否则无法跟踪。
92+
93+
#### 1.1.3 命令行方式配置参数
4994

5095
仍然以配置文件 `bracket.yaml` 为例,关于学习率部分的参数配置如下所示。
5196

@@ -94,7 +139,7 @@ TRAIN:
94139
# python example.py PATH="/workspace/lr=0.1,s=[3]/best_model.pdparams"
95140
```
96141
97-
#### 1.1.3 自动化运行实验
142+
#### 1.1.4 自动化运行实验
98143
99144
如 [1.1.2 命令行方式配置参数](#112) 所述,可以通过在程序执行命令的末尾加上合适的参数来控制多组实验的运行配置,接下来以自动化执行四组实验为例,介绍如何利用 hydra 的 [multirun](https://hydra.cc/docs/1.0/tutorials/basic/running_your_app/multi-run/#internaldocs-banner) 功能,实现该目的。
100145
@@ -675,7 +720,7 @@ PaddleScience 提供了多种推理配置组合,可通过命令行进行组合
675720
solver.eval()
676721
```
677722
678-
### 1.7 实验过程可视化
723+
### 1.7 实验过程可视化
679724
680725
=== "TensorBoardX"
681726
@@ -945,7 +990,7 @@ best_value: 0.02460772916674614
945990
946991
### 2.2 分布式训练
947992
948-
#### 2.2.1 数据并行
993+
#### 2.2.1 数据并行
949994
950995
接下来以 `examples/pipe/poiseuille_flow.py` 为例,介绍如何正确使用 PaddleScience 的数据并行功能进行训练。分布式训练细节可以参考:[Paddle-使用指南-分布式训练-快速开始-数据并行](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/06_distributed_training/cluster_quick_start_collective_cn.html)。
951996
@@ -1110,7 +1155,7 @@ PaddleScience 内置了两种模型平均方法:[Stochastic weight averaging(S
11101155
3. 设置平均间隔为 1 个 epoch
11111156
4. 设置平均的起始和终止 epoch 为 75100
11121157
1113-
### 2.7 回调(callback)注册与调用指南
1158+
### 2.7 回调函数(callback)
11141159
11151160
在深度学习模型的训练过程中,能够在特定的时机执行自定义逻辑是非常有用的。PaddleScience 的 `Solver` 类提供了一种相对灵活的机制,允许用户在**训练的不同阶段**注册和调用回调函数。
11161161

0 commit comments

Comments
 (0)