Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【hydra No.12】deephpms #603

Merged
merged 4 commits into from
Oct 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 66 additions & 43 deletions docs/zh/examples/deephpms.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,29 @@

<a href="https://aistudio.baidu.com/aistudio/projectdetail/6508962" class="md-button md-button--primary" style>AI Studio快速体验</a>

=== "模型训练命令"

``` sh
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers_sine.mat -O ./datasets/DeepHPMs/burgers_sine.mat
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers.mat -O ./datasets/DeepHPMs/burgers.mat
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers_sine.mat --output ./datasets/DeepHPMs/burgers_sine.mat
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers.mat --output ./datasets/DeepHPMs/burgers.mat
python burgers.py
```

=== "模型评估命令"

``` sh
# linux
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers_sine.mat -O ./datasets/DeepHPMs/burgers_sine.mat
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers.mat -O ./datasets/DeepHPMs/burgers.mat
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers_sine.mat --output ./datasets/DeepHPMs/burgers_sine.mat
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers.mat --output ./datasets/DeepHPMs/burgers.mat
python burgers.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/DeepHPMs/burgers_pretrained.pdparams
```

## 1. 背景简介

求解偏微分方程(PDE) 是一类基础的物理问题,在过去几十年里,以有限差分(FDM)、有限体积(FVM)、有限元(FEM)为代表的多种偏微分方程组数值解法趋于成熟。随着人工智能技术的高速发展,利用深度学习求解偏微分方程成为新的研究趋势。PINNs(Physics-informed neural networks) 是一种加入物理约束的深度学习网络,因此与纯数据驱动的神经网络学习相比,PINNs 可以用更少的数据样本学习到更具泛化能力的模型,其应用范围包括但不限于流体力学、热传导、电磁场、量子力学等领域。
Expand Down Expand Up @@ -39,9 +62,9 @@ $$

运行本问题代码前请下载 [模拟数据集1](https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers_sine.mat) 和 [模拟数据集2](https://paddle-org.bj.bcebos.com/paddlescience/datasets/DeepHPMs/burgers.mat), 下载后分别存放在路径:

``` py linenums="55"
``` yaml linenums="26"
--8<--
examples/deephpms/burgers.py:55:56
examples/deephpms/conf/burgers.yaml:26:27
--8<--
```

Expand All @@ -57,9 +80,9 @@ Net1 通过数据驱动的方式,使用输入的某种模拟情况 1 下的少

因为训练中后一个阶段网络需要使用前一个阶段网络的前向推理值,因此本问题使用 Model List 来实现,上式中 $f_1,f_2,f_3$ 分别为一个 MLP 模型,三者共同构成了一个 Model List,用 PaddleScience 代码表示如下

``` py linenums="68"
``` py linenums="99"
--8<--
examples/deephpms/burgers.py:68:71
examples/deephpms/burgers.py:99:100
--8<--
```

Expand All @@ -69,33 +92,33 @@ examples/deephpms/burgers.py:68:71

对于 Net1,输入为 $(x, t)$ 本来不需要 transform,但由于训练中根据数据的定义域对输入数据进行了数值变换,因此同样需要transform,同样,Net3 也需要对输入进行数值变换的 transform

``` py linenums="73"
``` py linenums="72"
--8<--
examples/deephpms/burgers.py:73:79
examples/deephpms/burgers.py:72:77
--8<--
```

对于 Net2,因为它的输入为 $u, u_x, u_{xx}$ 而 $u$ 为其他两个网络的输出,只要进行 Net2 的前向推理,就需要 transform,因此需要两种 transform。同时,在训练 Net3 之前,需要重新注册 transform

``` py linenums="81"
``` py linenums="88"
--8<--
examples/deephpms/burgers.py:81:94
examples/deephpms/burgers.py:88:92
--8<--
```

然后依次注册 transform 后,将3 个 MLP 模型组成 Model List

``` py linenums="96"
``` py linenums="100"
--8<--
examples/deephpms/burgers.py:96:102
examples/deephpms/burgers.py:95:100
--8<--
```

注意 Net3 开始训练前,重新注册 Net2 的transform

``` py linenums="243"
--8<--
examples/deephpms/burgers.py:243:244
examples/deephpms/burgers.py:236:237
--8<--
```

Expand All @@ -105,27 +128,27 @@ examples/deephpms/burgers.py:243:244

我们需要指定问题相关的参数,如数据集路径、输出文件路径、定义域的值等

``` py linenums="53"
``` yaml linenums="26"
--8<--
examples/deephpms/burgers.py:53:66
examples/deephpms/conf/burgers.yaml:26:33
--8<--
```

同时需要指定训练轮数和学习率等超参数

``` py linenums="104"
``` yaml linenums="57"
--8<--
examples/deephpms/burgers.py:104:107
examples/deephpms/conf/burgers.yaml:57:61
--8<--
```

### 3.5 优化器构建

本问题提供了两种优化器,分别为 Adam 优化器和 LBFGS 优化器,训练时只选择其中一种,需要将另一种优化器注释掉。

``` py linenums="109"
``` py linenums="103"
--8<--
examples/deephpms/burgers.py:109:118
examples/deephpms/burgers.py:103:111
--8<--
```

Expand All @@ -135,9 +158,9 @@ examples/deephpms/burgers.py:109:118

无监督仍然可以采用监督约束 `SupervisedConstraint`,在定义约束之前,需要给监督约束指定文件路径等数据读取配置,因为数据集中没有标签数据,因此在数据读取时我们需要使用训练数据充当标签数据,并注意在之后不要使用这部分“假的”标签数据,例如

``` py linenums="180"
``` py linenums="115"
--8<--
examples/deephpms/burgers.py:180:188
examples/deephpms/burgers.py:115:123
--8<--
```

Expand All @@ -147,9 +170,9 @@ examples/deephpms/burgers.py:180:188

第一阶段对 Net1 的训练是纯监督学习,此处采用监督约束 `SupervisedConstraint`

``` py linenums="121"
``` py linenums="125"
--8<--
examples/deephpms/burgers.py:121:138
examples/deephpms/burgers.py:125:131
--8<--
```

Expand All @@ -173,9 +196,9 @@ examples/deephpms/burgers.py:121:138

第二阶段对 Net2 的训练是无监督学习,但仍可采用监督约束 `SupervisedConstraint`,要注意上述提到的给定“假的”标签数据

``` py linenums="179"
``` py linenums="144"
--8<--
examples/deephpms/burgers.py:179:199
examples/deephpms/burgers.py:144:151
--8<--
```

Expand All @@ -187,9 +210,9 @@ examples/deephpms/burgers.py:179:199

第三阶段 Net3 的训练复杂,包含了对部分初始点的监督学习、与 PDE 有关的无监督学习以及与边界条件有关的无监督学习,这里仍采用监督约束 `SupervisedConstraint`,同样要注意给定“假的”标签数据,各参数含义同上

``` py linenums="246"
``` py linenums="183"
--8<--
examples/deephpms/burgers.py:246:303
examples/deephpms/burgers.py:183:192
--8<--
```

Expand All @@ -203,29 +226,29 @@ examples/deephpms/burgers.py:246:303

评价指标 `metric` 为 `L2` 正则化函数

``` py linenums="140"
``` py linenums="205"
--8<--
examples/deephpms/burgers.py:140:158
examples/deephpms/burgers.py:205:215
--8<--
```

#### 3.7.2 第二阶段评估器构建

评价指标 `metric` 为 `FunctionalMetric`,这是 PaddleScience 预留的自定义 metric 函数类,该类支持编写代码时自定义 metric 的计算方法,而不是使用诸如 `MSE`、 `L2` 等现有方法。自定义 metric 函数代码请参考下一部分 [自定义 loss 和 metric](#38)。

``` py linenums="201"
``` py linenums="268"
--8<--
examples/deephpms/burgers.py:201:222
examples/deephpms/burgers.py:268:291
--8<--
```

#### 3.7.3 第三阶段评估器构建

因为第三阶段评价时只需要对训练得到的点的值进行评价,而不需要对边界条件满足程度或 PDE 满足程度进行评价,因此评价指标 `metric` 为 `L2` 正则化函数

``` py linenums="305"
``` py linenums="309"
--8<--
examples/deephpms/burgers.py:305:325
examples/deephpms/burgers.py:309:318
--8<--
```

Expand All @@ -237,25 +260,25 @@ examples/deephpms/burgers.py:305:325

与 PDE 相关的自定义 loss 函数为

``` py linenums="25"
``` py linenums="28"
--8<--
examples/deephpms/burgers.py:25:27
examples/deephpms/burgers.py:28:30
--8<--
```

与 PDE 相关的自定义 metric 函数为

``` py linenums="30"
``` py linenums="33"
--8<--
examples/deephpms/burgers.py:30:35
examples/deephpms/burgers.py:33:38
--8<--
```

与边界条件相关的自定义 loss 函数为

``` py linenums="38"
``` py linenums="41"
--8<--
examples/deephpms/burgers.py:38:49
examples/deephpms/burgers.py:41:52
--8<--
```

Expand All @@ -265,25 +288,25 @@ examples/deephpms/burgers.py:38:49

第一阶段训练、评估

``` py linenums="160"
``` py linenums="154"
--8<--
examples/deephpms/burgers.py:160:176
examples/deephpms/burgers.py:154:169
--8<--
```

第二阶段训练、评估

``` py linenums="224"
``` py linenums="218"
--8<--
examples/deephpms/burgers.py:224:240
examples/deephpms/burgers.py:218:233
--8<--
```

第三阶段训练、评估

``` py linenums="327"
``` py linenums="321"
--8<--
examples/deephpms/burgers.py:327:343
examples/deephpms/burgers.py:321:336
--8<--
```

Expand Down
Loading