Skip to content

Commit 1c6043f

Browse files
【Hackathon 6th No.39】XPINN 迁移至 PaddleScience (#835)
* 【Hackathon 6th No.39】XPINN 迁移至 PaddleScience * Update 20240325_science_xpinn.md
1 parent c85cfea commit 1c6043f

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# XPINN 迁移至 PaddleScience
2+
3+
| | |
4+
| ------------ | ----------------- |
5+
| 提交作者 | MayYouBeProsperous |
6+
| 提交时间 | 2024-03-25 |
7+
| RFC 版本号 | v1.0 |
8+
| 依赖飞桨版本 | 2.6 版本 |
9+
| 文件名 | 20240325_science_xpinn.md |
10+
11+
## 1. 概述
12+
13+
### 1.1 相关背景
14+
15+
求解偏微分方程(PDE) 是一类基础的物理问题,随着人工智能技术的高速发展,利用深度学习求解偏微分方程成为新的研究趋势。PINNs(Physics-informed neural networks) 是一种加入物理约束的深度学习网络,因此与纯数据驱动的神经网络学习相比,PINNs 可以用更少的数据样本学习到更具泛化能力的模型,其应用范围包括但不限于流体力学、热传导、电磁场、量子力学等领域。
16+
17+
基于 PINNs 框架,A.D.Jagtap 等人提出了一种扩展 PINNs —— XPINNs 。对比传统的 PINNs,XPINNs 有如下特点:
18+
19+
1. 广义时空域分解: XPINN 提供在 $C^0$ 或者更规则的边界上的高度不规则的、凸与非凸的时空域分解。
20+
21+
2. 可扩展到任意的微分方程:基于 XPINN 方法的域分解方法可以扩展到任何类型的偏微分方程。
22+
23+
3. 简单的界面条件:XPINN 可以轻松扩展到任何复杂的几何形状,以及更高的维度上。
24+
25+
### 1.2 功能目标
26+
27+
使用 PaddleScience 套件复现 XPINN 案例,并使训练精度满足要求。
28+
29+
### 1.3 意义
30+
31+
丰富 PaddleScience 套件内容,验证套件在求解 PDE 问题上应用的正确性和广泛性。
32+
33+
## 2. PaddleScience 现状
34+
35+
PaddleScience 套件中有完善的套件模块,比如数据加载、网络架构、优化器和求解器等,能够很便捷地构建新的模型。目前套件中已有 [XPINN 案例](https://github.com/PaddlePaddle/PaddleScience/tree/develop/jointContribution/XPINNs),但是案例基于 Paddle 的实现,未使用 PaddleScience API 实现。
36+
37+
## 3. 目标调研
38+
39+
[PR 535](https://github.com/PaddlePaddle/community/pull/535) 使用 Paddle 复现了 XPINN 案例,本次任务将在此基础上,使用 PaddleScience API 实现把 XPINN 案例,总体难度不大。
40+
41+
可能存在的难点是 XPINN 算法的实现。
42+
43+
## 4. 设计思路与实现方案
44+
45+
实验案例是二维泊松方程的求解:
46+
47+
$$ \Delta u = f(x, y), x,y \in \Omega \subset R^2$$
48+
49+
边界表达式:
50+
51+
$$ r =1.5+0.14 sin(4θ)+0.12 cos(6θ)+0.09 cos(5θ) $$
52+
53+
上述区域被分为三个不规则的、非凸的子域训练求解,数据集中包含三个子域的数据点。
54+
55+
1. 数据集加载
56+
57+
数据集以字典的形式存储在 .mat 文件中,使用 `IterableMatDataset` 读取数据。
58+
59+
```python
60+
train_dataloader_cfg = {
61+
"dataset": {
62+
"name": "IterableMatDataset",
63+
"file_path": cfg.DATASET_PATH,
64+
"input_keys": ... ,
65+
"label_keys": ... ,
66+
"alias_dict": ... ,
67+
},
68+
}
69+
```
70+
71+
2. 模型构建
72+
73+
参考原案例,实现神经网络模型。
74+
75+
3. 参数和超参数设定
76+
77+
与原案例相同,学习率设为 0.0008,训练轮数设为 501。
78+
79+
4. 优化器构建
80+
81+
优化器使用 Adam 优化器。
82+
83+
```python
84+
optimizer = ppsci.optimizer.Adam(cfg.TRAIN.learning_rate)(model)
85+
```
86+
87+
5. 约束构建
88+
89+
使用监督约束 `SupervisedConstraint` 构建约束,损失函数需要自行定义。实现 XPINN 算法,在损失函数中调用计算损失。
90+
91+
```python
92+
sup_constraint = ppsci.constraint.SupervisedConstraint(
93+
train_dataloader_cfg,
94+
ppsci.loss.MSELoss( ... ),
95+
...
96+
)
97+
constraint = {sup_constraint.name: sup_constraint}
98+
```
99+
100+
6. 评估器构建
101+
102+
评价指标 metric 为 L2 正则化函数。
103+
104+
```python
105+
sup_validator = ppsci.validate.SupervisedValidator(
106+
eval_dataloader_cfg,
107+
ppsci.loss.MSELoss( ... ),
108+
...
109+
)
110+
validator = {sup_validator.name: sup_validator}
111+
```
112+
113+
7. 模型训练、评估
114+
115+
构建 `Solver`,开始训练评估。
116+
117+
```python
118+
solver = ppsci.solver.Solver( ... )
119+
# train model
120+
solver.train()
121+
# evaluate after finished training
122+
solver.eval()
123+
```
124+
125+
8. 可视化
126+
127+
使用 plot 进行可视化,原案例已经有可视化代码。
128+
129+
## 5. 测试和验收的考量
130+
131+
实验复现精度与 paddle 一致:
132+
133+
| | paddle|
134+
|---|---|
135+
|Test Loss | 2.138322e-01 |
136+
137+
## 6. 可行性分析和排期规划
138+
139+
2024.03.25~2024.04.30 完成案例代码的编写和模型训练。
140+
141+
2024.05.01~2024.05.07 完成案例文档的编写。
142+
143+
## 7. 影响面
144+
145+

0 commit comments

Comments
 (0)