Skip to content

Commit

Permalink
【hydra No.4】aneurysm (#607)
Browse files Browse the repository at this point in the history
* fix

* fix

* fix

* CI

* fix

* add result

* fix
  • Loading branch information
enkilee authored Nov 1, 2023
1 parent 5296a03 commit 692e225
Show file tree
Hide file tree
Showing 3 changed files with 318 additions and 121 deletions.
88 changes: 58 additions & 30 deletions docs/zh/examples/aneurysm.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,34 @@

<!-- <a href="TODO" class="md-button md-button--primary" style>AI Studio快速体验</a> -->

=== "模型训练命令"

``` sh
# linux
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/aneurysm/aneurysm_dataset.tar
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/aneurysm/aneurysm_dataset.tar --output aneurysm_dataset.tar
# unzip it
tar -xvf aneurysm_dataset.tar
python aneurysm.py
```

=== "模型评估命令"

``` sh
# linux
wget https://paddle-org.bj.bcebos.com/paddlescience/datasets/aneurysm/aneurysm_dataset.tar
# windows
# curl https://paddle-org.bj.bcebos.com/paddlescience/datasets/aneurysm/aneurysm_dataset.tar --output aneurysm_dataset.tar
# unzip it
tar -xvf aneurysm_dataset.tar
python aneurysm.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/aneurysm/aneurysm_pretrained.pdparams
```

| 预训练模型 | 指标 |
|:--| :--|
| [aneurysm_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/aneurysm/aneurysm_pretrained.pdparams) | loss(ref_u_v_w_p): 0.01488<br>MSE.p(ref_u_v_w_p): 0.01412<br>MSE.u(ref_u_v_w_p): 0.00021<br>MSE.v(ref_u_v_w_p): 0.00024<br>MSE.w(ref_u_v_w_p): 0.00032 |

## 1. 背景简介

深度学习方法可以用于处理血管瘤问题,其中包括基于物理信息的深度学习方法。这种方法可以用于脑血管瘤的压力建模,以预测和评估血管瘤破裂的风险。
Expand Down Expand Up @@ -32,9 +60,9 @@ $$

上式中 $f$ 即为 MLP 模型本身,用 PaddleScience 代码表示如下

``` py linenums="26"
``` py linenums="24"
--8<--
examples/aneurysm/aneurysm.py:26:29
examples/aneurysm/aneurysm.py:24:25
--8<--
```

Expand All @@ -46,9 +74,9 @@ examples/aneurysm/aneurysm.py:26:29

血管瘤模型涉及到 2 个方程,一是流体 N-S 方程,二是流量计算方程,因此使用 PaddleScience 内置的 `NavierStokes``NormalDotVec` 即可。

``` py linenums="31"
``` py linenums="27"
--8<--
examples/aneurysm/aneurysm.py:31:37
examples/aneurysm/aneurysm.py:27:33
--8<--
```

Expand Down Expand Up @@ -77,37 +105,37 @@ tar -xvf aneurysm_dataset.tar

然后通过 PaddleScience 内置的 STL 几何类 `Mesh` 来读取、解析这些几何文件,并且通过布尔运算,组合出各个计算域,代码如下:

``` py linenums="39"
``` py linenums="35"
--8<--
examples/aneurysm/aneurysm.py:39:44
examples/aneurysm/aneurysm.py:35:40
--8<--
```

在此之后可以对几何域进行缩放和平移,以缩放输入数据的坐标范围,促进模型训练收敛。

``` py linenums="46"
``` py linenums="42"
--8<--
examples/aneurysm/aneurysm.py:46:62
examples/aneurysm/aneurysm.py:42:54
--8<--
```

### 3.4 约束构建

本案例共涉及到 6 个约束,在具体约束构建之前,可以先构建数据读取配置,以便后续构建多个约束时复用该配置。

``` py linenums="64"
``` py linenums="56"
--8<--
examples/aneurysm/aneurysm.py:64:75
examples/aneurysm/aneurysm.py:56:66
--8<--
```

#### 3.4.1 内部点约束

以作用在内部点上的 `InteriorConstraint` 为例,代码如下:

``` py linenums="125"
``` py linenums="113"
--8<--
examples/aneurysm/aneurysm.py:125:132
examples/aneurysm/aneurysm.py:113:120
--8<--
```

Expand All @@ -128,27 +156,27 @@ examples/aneurysm/aneurysm.py:125:132
接着需要对**血管入口、出口、血管壁**这三个表面施加约束,包括入口速度约束、出口压力约束、血管壁无滑移约束。
`bc_inlet` 约束中,入口处的流速满足从中心点开始向周围呈二次抛物线衰减,此处使用抛物线函数表示速度随着远离圆心而衰减,再将其作为 `BoundaryConstraint` 的第二个参数(字典)的 value。

``` py linenums="77"
``` py linenums="68"
--8<--
examples/aneurysm/aneurysm.py:77:108
examples/aneurysm/aneurysm.py:68:96
--8<--
```

血管出口、血管壁约束的构建方法类似,如下所示:

``` py linenums="109"
``` py linenums="97"
--8<--
examples/aneurysm/aneurysm.py:109:124
examples/aneurysm/aneurysm.py:97:112
--8<--
```

#### 3.4.3 积分边界约束

对于血管入口下方的一段区域和出口区域(面),需额外施加流入和流出的流量约束,由于流量计算涉及到具体面积,因此需要使用离散积分的方式进行计算,这些过程已经内置在了 `IntegralConstraint` 这一约束条件中。如下所示:

``` py linenums="133"
``` py linenums="121"
--8<--
examples/aneurysm/aneurysm.py:133:160
examples/aneurysm/aneurysm.py:121:148
--8<--
```

Expand All @@ -164,39 +192,39 @@ $$

在微分方程约束、边界约束、初值约束构建完毕之后,以刚才的命名为关键字,封装到一个字典中,方便后续访问。

``` py linenums="161"
``` py linenums="149"
--8<--
examples/aneurysm/aneurysm.py:161:169
examples/aneurysm/aneurysm.py:149:157
--8<--
```

### 3.5 超参数设定

接下来需要指定训练轮数和学习率,此处按实验经验,使用 1500 轮训练轮数。

``` py linenums="171"
``` py linenums="59"
--8<--
examples/aneurysm/aneurysm.py:171:172
examples/aneurysm/conf/aneurysm.yaml:59:75
--8<--
```

### 3.6 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器,并配合使用机器学习中常用的 OneCycle 学习率调整策略。

``` py linenums="174"
``` py linenums="159"
--8<--
examples/aneurysm/aneurysm.py:174:183
examples/aneurysm/aneurysm.py:159:163
--8<--
```

### 3.7 评估器构建

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

``` py linenums="185"
``` py linenums="165"
--8<--
examples/aneurysm/aneurysm.py:185:234
examples/aneurysm/aneurysm.py:165:241
--8<--
```

Expand All @@ -206,19 +234,19 @@ examples/aneurysm/aneurysm.py:185:234

本文中的输出数据是一个区域内的三维点集,因此只需要将评估的输出数据保存成 **vtu格式** 文件,最后用可视化软件打开查看即可。代码如下:

``` py linenums="236"
``` py linenums="216"
--8<--
examples/aneurysm/aneurysm.py:236:250
examples/aneurysm/aneurysm.py:216:229
--8<--
```

### 3.9 模型训练、评估与可视化

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

``` py linenums="251"
``` py linenums="231"
--8<--
examples/aneurysm/aneurysm.py:251:278
examples/aneurysm/aneurysm.py:231:258
--8<--
```

Expand Down
Loading

0 comments on commit 692e225

Please sign in to comment.