Skip to content

[Doc] Add evaluation for xpinn and add to homepage #912

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

Merged
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
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ PaddleScience 是一个基于深度学习框架 PaddlePaddle 开发的科学计

| 问题类型 | 案例名称 | 优化算法 | 模型类型 | 训练方式 | 数据集 | 参考资料 |
|-----|---------|-----|---------|----|---------|---------|
| 相场方程 | [Allen-Cahn](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/allen_cahn) | 机理驱动 | MLP | 无监督学习 | [Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/AllenCahn/allen_cahn.mat) | [Paper](https://arxiv.org/pdf/2402.00326) |
| 微分方程 | [拉普拉斯方程](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/laplace2d) | 机理驱动 | MLP | 无监督学习 | - | - |
| 微分方程 | [伯格斯方程](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/deephpms) | 机理驱动 | MLP | 无监督学习 | [Data](https://github.com/maziarraissi/DeepHPMs/tree/master/Data) | [Paper](https://arxiv.org/pdf/1801.06637.pdf) |
| 微分方程 | [非线性偏微分方程](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/pirbn) | 机理驱动 | PIRBN | 无监督学习 | - | [Paper](https://arxiv.org/abs/2304.06234) |
Expand All @@ -38,7 +39,7 @@ PaddleScience 是一个基于深度学习框架 PaddlePaddle 开发的科学计
| 微分方程 | [分数阶微分方程](https://github.com/PaddlePaddle/PaddleScience/blob/develop/examples/fpde/fractional_poisson_2d.py) | 机理驱动 | MLP | 无监督学习 | - | - |
| 光孤子 | [Optical soliton](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/nlsmb) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.1007/s11071-023-08824-w)|
| 光纤怪波 | [Optical rogue wave](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/nlsmb) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.1007/s11071-023-08824-w)|
| 相场方程 | [Allen-Cahn](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/allen_cahn) | 机理驱动 | MLP | 无监督学习 | [Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/AllenCahn/allen_cahn.mat) | [Paper](https://arxiv.org/pdf/2402.00326) |
| 域分解 | [XPINN](https://paddlescience-docs.readthedocs.io/zh/latest/zh/examples/xpinns) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.4208/cicp.OA-2020-0164)|

<br>
<p align="center"><b>技术科学(AI for Technology)</b></p>
Expand Down
3 changes: 2 additions & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@

| 问题类型 | 案例名称 | 优化算法 | 模型类型 | 训练方式 | 数据集 | 参考资料 |
|-----|---------|-----|---------|----|---------|---------|
| 相场方程 | [Allen-Cahn](./zh/examples/allen_cahn.md) | 机理驱动 | MLP | 无监督学习 | [Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/AllenCahn/allen_cahn.mat) | [Paper](https://arxiv.org/pdf/2402.00326) |
| 微分方程 | [拉普拉斯方程](./zh/examples/laplace2d.md) | 机理驱动 | MLP | 无监督学习 | - | - |
| 微分方程 | [伯格斯方程](./zh/examples/deephpms.md) | 机理驱动 | MLP | 无监督学习 | [Data](https://github.com/maziarraissi/DeepHPMs/tree/master/Data) | [Paper](https://arxiv.org/pdf/1801.06637.pdf) |
| 微分方程 | [非线性偏微分方程](./zh/examples/pirbn.md) | 机理驱动 | PIRBN | 无监督学习 | - | [Paper](https://arxiv.org/abs/2304.06234) |
Expand All @@ -83,7 +84,7 @@
| 微分方程 | [分数阶微分方程](https://github.com/PaddlePaddle/PaddleScience/blob/develop/examples/fpde/fractional_poisson_2d.py) | 机理驱动 | MLP | 无监督学习 | - | - |
| 光孤子 | [Optical soliton](./zh/examples/nlsmb.md) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.1007/s11071-023-08824-w)|
| 光纤怪波 | [Optical rogue wave](./zh/examples/nlsmb.md) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.1007/s11071-023-08824-w)|
| 相场方程 | [Allen-Cahn](./zh/examples/allen_cahn.md) | 机理驱动 | MLP | 无监督学习 | [Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/AllenCahn/allen_cahn.mat) | [Paper](https://arxiv.org/pdf/2402.00326) |
| 域分解 | [XPINN](./zh/examples/xpinns.md) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://doi.org/10.4208/cicp.OA-2020-0164)|

<br>
<p align="center"><b>技术科学(AI for Technology)</b></p>
Expand Down
53 changes: 32 additions & 21 deletions docs/zh/examples/xpinns.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,25 @@
``` sh
# linux
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat -P ./data/

# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat --output ./data/XPINN_2D_PoissonEqn.mat

# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat --create-dirs -o ./data/XPINN_2D_PoissonEqn.mat
python xpinn.py
```

=== "模型评估命令"

``` sh
# linux
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat -P ./data/
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat --create-dirs -o ./data/XPINN_2D_PoissonEqn.mat
python xpinn.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/XPINN/xpinn_pretrained.pdparams
```

| 预训练模型 | 指标 |
|:--| :--|
| [xpinn_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/XPINN/xpinn_pretrained.pdparams) | L2Rel.l2_error: 0.04226 |

## 1. 背景简介

求解偏微分方程(PDE)是一类基础的物理问题,随着人工智能技术的高速发展,利用深度学习求解偏微分方程成为新的研究趋势。[XPINNs(Extended Physics-Informed Neural Networks)](https://doi.org/10.4208/cicp.OA-2020-0164)是一种适用于物理信息神经网络(PINNs)的广义时空域分解方法,以求解任意复杂几何域上的非线性偏微分方程。
Expand Down Expand Up @@ -57,7 +68,7 @@ $$ \gamma_2 =0.34+0.04 sin(5θ)+0.18 cos(3θ)+0.1 cos(6θ), θ \in [0,2π) $$
wget -nc https://paddle-org.bj.bcebos.com/paddlescience/datasets/XPINN/XPINN_2D_PoissonEqn.mat -P ./data/
```

### 3.3 模型构建
### 3.2 模型构建

在本问题中,我们使用神经网络 `MLP` 作为模型,在模型代码中定义三个 `MLP` ,分别作为三个子区域的模型。

Expand All @@ -74,15 +85,15 @@ examples/xpinn/xpinn.py:301:302
<figcaption>XPINN子网络的训练过程</figcaption>
</figure>

### 3.4 约束构建
### 3.3 约束构建

在本案例中,我们使用监督数据集对模型进行训练,因此需要构建监督约束。

在定义约束之前,我们需要指定数据集的路径等相关配置,将这些信息存放到对应的 YAML 文件中,如下所示。

``` yaml linenums="43"
``` yaml linenums="44"
--8<--
examples/xpinn/conf/xpinn.yaml:43:44
examples/xpinn/conf/xpinn.yaml:44:45
--8<--
```

Expand All @@ -102,17 +113,17 @@ examples/xpinn/xpinn.py:304:311
--8<--
```

### 3.5 超参数设定
### 3.4 超参数设定

设置训练轮数等参数,如下所示。

``` yaml linenums="83"
``` yaml linenums="84"
--8<--
examples/xpinn/conf/xpinn.yaml:83:88
examples/xpinn/conf/xpinn.yaml:84:89
--8<--
```

### 3.6 优化器构建
### 3.5 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器。

Expand All @@ -122,7 +133,7 @@ examples/xpinn/xpinn.py:337:338
--8<--
```

### 3.7 评估器构建
### 3.6 评估器构建

在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.SupervisedValidator` 构建评估器。

Expand All @@ -132,37 +143,37 @@ examples/xpinn/xpinn.py:324:335
--8<--
```

评估指标为预测结果和真实结果的 RMSE 值,这里需自定义指标计算函数,如下所示。
评估指标为预测结果和真实结果的 L2 相对误差值,这里需自定义指标计算函数,如下所示。

``` py linenums="194"
--8<--
examples/xpinn/xpinn.py:194:219
--8<--
```

### 3.8 模型训练
### 3.7 模型训练评估

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练。
完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练、评估

``` py linenums="340"
--8<--
examples/xpinn/xpinn.py:340:357
examples/xpinn/xpinn.py:340:350
--8<--
```

### 3.9 结果可视化
### 3.8 结果可视化

训练完毕之后程序会对测试集中的数据进行预测,并以图片的形式对结果进行可视化,如下所示。

``` py linenums="360"
``` py linenums="352"
--8<--
examples/xpinn/xpinn.py:360:384
examples/xpinn/xpinn.py:352:376
--8<--
```

## 4. 完整代码

``` py linenums="1" title="cfdgcn.py"
``` py linenums="1" title="xpinn.py"
--8<--
examples/xpinn/xpinn.py
--8<--
Expand All @@ -181,4 +192,4 @@ examples/xpinn/xpinn.py

## 6. 参考文献

* [A.D.Jagtap, G.E.Karniadakis, Extended Physics-Informed Neural Networks (XPINNs): A Generalized Space-Time Domain Decomposition Based Deep Learning Framework for Nonlinear Partial Differential Equations, Commun. Comput. Phys., Vol.28, No.5, 2002-2041, 2020.](https://doi.org/10.4208/cicp.OA-2020-0164)
- [Extended Physics-Informed Neural Networks (XPINNs): A Generalized Space-Time Domain Decomposition Based Deep Learning Framework for Nonlinear Partial Differential Equations](https://doi.org/10.4208/cicp.OA-2020-0164)
19 changes: 10 additions & 9 deletions examples/xpinn/conf/xpinn.yaml
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
defaults:
- ppsci_default
- TRAIN: train_default
- TRAIN/ema: ema_default
- TRAIN/swa: swa_default
- EVAL: eval_default
- INFER: infer_default
- hydra/job/config/override_dirname/exclude_keys: exclude_keys_default
- _self_

hydra:
run:
# dynamic output directory according to running time and override name
dir: outputs_xpinn/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
job:
name: ${mode} # name of logfile
chdir: false # keep current working direcotry unchaned
config:
override_dirname:
exclude_keys:
- TRAIN.checkpoint_path
- TRAIN.pretrained_model_path
- EVAL.pretrained_model_path
- mode
- output_dir
- log_freq
callbacks:
init_callback:
_target_: ppsci.utils.callbacks.InitCallback
Expand Down
24 changes: 15 additions & 9 deletions examples/xpinn/plotting.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,9 @@ def log_image(
gridspec.GridSpec(1, 1)
ax = plt.subplot2grid((1, 1), (0, 0))
tcf = ax.tricontourf(triang_total, np.squeeze(residual_u_exact), 100, cmap="jet")
ax.add_patch(patches.Polygon(xx, closed=True, fill=True, color="w", edgecolor="w"))
ax.add_patch(
patches.Polygon(xx, closed=True, fill=True, facecolor="w", edgecolor="w")
)
tcbar = fig.colorbar(tcf)
tcbar.ax.tick_params(labelsize=28)
ax.set_xlabel("$x$", fontsize=32)
Expand Down Expand Up @@ -111,7 +113,9 @@ def log_image(
gridspec.GridSpec(1, 1)
ax = plt.subplot2grid((1, 1), (0, 0))
tcf = ax.tricontourf(triang_total, residual_u_pred.flatten(), 100, cmap="jet")
ax.add_patch(patches.Polygon(xx, closed=True, fill=True, color="w", edgecolor="w"))
ax.add_patch(
patches.Polygon(xx, closed=True, fill=True, facecolor="w", edgecolor="w")
)
tcbar = fig.colorbar(tcf)
tcbar.ax.tick_params(labelsize=28)
ax.set_xlabel("$x$", fontsize=32)
Expand Down Expand Up @@ -146,7 +150,9 @@ def log_image(
100,
cmap="jet",
)
ax.add_patch(patches.Polygon(xx, closed=True, fill=True, color="w", edgecolor="w"))
ax.add_patch(
patches.Polygon(xx, closed=True, fill=True, facecolor="w", edgecolor="w")
)
tcbar = fig.colorbar(tcf)
tcbar.ax.tick_params(labelsize=28)
ax.set_xlabel("$x$", fontsize=32)
Expand All @@ -173,13 +179,13 @@ def log_image(
plt.show()


pgf_with_latex = { # setup matplotlib to use latex for output
PGF_WITH_LATEX = { # setup matplotlib to use latex for output
"pgf.texsystem": "pdflatex", # change this if using xetex or latex
"text.usetex": True, # use LaTeX to write all text
"font.family": "serif",
"font.serif": [], # blank entries should cause plots to inherit fonts from the document
"font.sans-serif": [],
"font.monospace": [],
# "font.family": "serif",
# "font.serif": [], # blank entries should cause plots to inherit fonts from the document
# "font.sans-serif": [],
# "font.monospace": [],
"axes.labelsize": 10, # LaTeX default is 10pt font.
"font.size": 10,
"legend.fontsize": 8, # Make the legend/label fonts a little smaller
Expand All @@ -193,4 +199,4 @@ def log_image(
]
),
}
mpl.rcParams.update(pgf_with_latex)
mpl.rcParams.update(PGF_WITH_LATEX)
23 changes: 6 additions & 17 deletions examples/xpinn/xpinn.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ def residual_func(output_der: paddle.Tensor, input: paddle.Tensor) -> paddle.Ten
return loss1 + loss2 + loss3


def eval_rmse_func(
def eval_l2_rel_func(
output_dict: Dict[str, paddle.Tensor],
label_dict: Dict[str, paddle.Tensor],
*args,
Expand Down Expand Up @@ -329,7 +329,7 @@ def train_dataset_transform_func(
"residual2_u": lambda out: out["residual2_u"],
"residual3_u": lambda out: out["residual3_u"],
},
metric={"RMSE": ppsci.metric.FunctionalMetric(eval_rmse_func)},
metric={"L2Rel": ppsci.metric.FunctionalMetric(eval_l2_rel_func)},
name="sup_validator",
)
validator = {sup_validator.name: sup_validator}
Expand All @@ -341,17 +341,9 @@ def train_dataset_transform_func(
solver = ppsci.solver.Solver(
custom_model,
constraint,
cfg.output_dir,
optimizer,
None,
cfg.TRAIN.epochs,
cfg.TRAIN.iters_per_epoch,
save_freq=cfg.TRAIN.save_freq,
eval_during_train=cfg.TRAIN.eval_during_train,
eval_freq=cfg.TRAIN.eval_freq,
optimizer=optimizer,
validator=validator,
eval_with_no_grad=cfg.EVAL.eval_with_no_grad,
checkpoint_path=cfg.TRAIN.checkpoint_path,
cfg=cfg,
)

solver.train()
Expand Down Expand Up @@ -412,19 +404,16 @@ def evaluate(cfg: DictConfig):
"residual2_u": lambda out: out["residual2_u"],
"residual3_u": lambda out: out["residual3_u"],
},
metric={"RMSE": ppsci.metric.FunctionalMetric(eval_rmse_func)},
metric={"L2Rel": ppsci.metric.FunctionalMetric(eval_l2_rel_func)},
name="sup_validator",
)
validator = {sup_validator.name: sup_validator}

# initialize solver
solver = ppsci.solver.Solver(
custom_model,
output_dir=cfg.output_dir,
eval_freq=cfg.TRAIN.eval_freq,
validator=validator,
eval_with_no_grad=cfg.EVAL.eval_with_no_grad,
checkpoint_path=cfg.TRAIN.checkpoint_path,
cfg=cfg,
)

solver.eval()
Expand Down
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ nav:
- Rossler_transform_physx: zh/examples/rossler.md
- Volterra_IDE: zh/examples/volterra_ide.md
- NLSMB: zh/examples/nlsmb.md
- XPINN: zh/examples/xpinns.md
- 技术科学(AI for Technology):
- 流体:
- AMGNet: zh/examples/amgnet.md
Expand Down
2 changes: 1 addition & 1 deletion ppsci/arch/sfnonet.py
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ class SFNONet(base.Arch):
norm (str, optional): Normalization layer to use. Defaults to None.
ada_in_features (int,optional): The input channles of the adaptive normalization.Defaults to None.
preactivation (bool, optional): Whether to use resnet-style preactivation. Defaults to False.
skip (str, optional): Type of skip connection to use,{'linear', 'identity', 'soft-gating'}.
fno_skip (str, optional): Type of skip connection to use,{'linear', 'identity', 'soft-gating'}.
Defaults to "soft-gating".
separable (bool, optional): Whether to use a depthwise separable spectral convolution.
Defaults to False.
Expand Down
Loading