Skip to content
Open
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
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ PaddleScience 是一个基于深度学习框架 PaddlePaddle 开发的科学计
| 流场高分辨率重构 | [2D 湍流流场重构](https://aistudio.baidu.com/projectdetail/4493261?contributionType=1) | 数据驱动 | cycleGAN | 监督学习 | [Train Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tempoGAN/2d_train.mat)<br>[Eval Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tempoGAN/2d_valid.mat) | [Paper](https://arxiv.org/abs/2007.15324)|
| 流场高分辨率重构 | [基于Voronoi嵌入辅助深度学习的稀疏传感器全局场重建](https://aistudio.baidu.com/projectdetail/5807904) | 数据驱动 | CNN | 监督学习 | [Data1](https://drive.google.com/drive/folders/1K7upSyHAIVtsyNAqe6P8TY1nS5WpxJ2c)<br>[Data2](https://drive.google.com/drive/folders/1pVW4epkeHkT2WHZB7Dym5IURcfOP4cXu)<br>[Data3](https://drive.google.com/drive/folders/1xIY_jIu-hNcRY-TTf4oYX1Xg4_fx8ZvD) | [Paper](https://arxiv.org/pdf/2202.11214.pdf) |
| 流场预测 | [Catheter](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/catheter/) | 数据驱动 | FNO | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/291940) | [Paper](https://www.science.org/doi/pdf/10.1126/sciadv.adj1741) |
| 流场预测 | [Catheter](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/confild/) | 数据驱动 | CONFILD | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/9736790) | [Paper](https://doi.org/10.1038/s41467-024-54712-1) |
| 求解器耦合 | [CFD-GCN](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/cfdgcn) | 数据驱动 | GCN | 监督学习 | [Data](https://aistudio.baidu.com/aistudio/datasetdetail/184778)<br>[Mesh](https://paddle-org.bj.bcebos.com/paddlescience/datasets/CFDGCN/meshes.tar) | [Paper](https://arxiv.org/abs/2007.04439)|
| 受力分析 | [1D 欧拉梁变形](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/euler_beam) | 机理驱动 | MLP | 无监督学习 | - | - |
| 受力分析 | [2D 平板变形](https://paddlescience-docs.readthedocs.io/zh-cn/latest/zh/examples/biharmonic2d) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://arxiv.org/abs/2108.07243) |
Expand Down
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@
| 流场高分辨率重构 | [2D 湍流流场重构](https://aistudio.baidu.com/projectdetail/4493261?contributionType=1) | 数据驱动 | cycleGAN | 监督学习 | [Train Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tempoGAN/2d_train.mat)<br>[Eval Data](https://paddle-org.bj.bcebos.com/paddlescience/datasets/tempoGAN/2d_valid.mat) | [Paper](https://arxiv.org/abs/2007.15324)|
| 流场高分辨率重构 | [基于Voronoi嵌入辅助深度学习的稀疏传感器全局场重建](https://aistudio.baidu.com/projectdetail/5807904) | 数据驱动 | CNN | 监督学习 | [Data1](https://drive.google.com/drive/folders/1K7upSyHAIVtsyNAqe6P8TY1nS5WpxJ2c)<br>[Data2](https://drive.google.com/drive/folders/1pVW4epkeHkT2WHZB7Dym5IURcfOP4cXu)<br>[Data3](https://drive.google.com/drive/folders/1xIY_jIu-hNcRY-TTf4oYX1Xg4_fx8ZvD) | [Paper](https://arxiv.org/pdf/2202.11214.pdf) |
| 流场预测 | [Catheter](https://aistudio.baidu.com/projectdetail/5379212) | 数据驱动 | FNO | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/291940) | [Paper](https://www.science.org/doi/pdf/10.1126/sciadv.adj1741) |
| 流场预测 | [CONFILD](https://aistudio.baidu.com/projectdetail/5379212) | 数据驱动 | CONFILD | 监督学习 | [Data](https://aistudio.baidu.com/datasetdetail/9736790) | [Paper](https://doi.org/10.1038/s41467-024-54712-1) |
| 求解器耦合 | [CFD-GCN](./zh/examples/cfdgcn.md) | 数据驱动 | GCN | 监督学习 | [Data](https://aistudio.baidu.com/aistudio/datasetdetail/184778)<br>[Mesh](https://paddle-org.bj.bcebos.com/paddlescience/datasets/CFDGCN/meshes.tar) | [Paper](https://arxiv.org/abs/2007.04439)|
| 受力分析 | [1D 欧拉梁变形](./zh/examples/euler_beam.md) | 机理驱动 | MLP | 无监督学习 | - | - |
| 受力分析 | [2D 平板变形](./zh/examples/biharmonic2d.md) | 机理驱动 | MLP | 无监督学习 | - | [Paper](https://arxiv.org/abs/2108.07243) |
Expand Down
103 changes: 103 additions & 0 deletions docs/zh/examples/confild.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# AI辅助的时空湍流生成:条件神经场潜在扩散模型(CoNFILD)

Distributed under a Creative Commons Attribution license 4.0 (CC BY).

## 1. 背景简介
### 1.1 论文信息
| 年份 | 期刊 | 作者 | 引用数 | 论文PDF与补充材料 |
|----------------|---------------------|--------------------------------------------------------------------------------------------------|--------|----------------------------------------------------------------------------------------------------|
| 2024年1月3日 | Nature Communications | Pan Du, Meet Hemant Parikh, Xiantao Fan, Xin-Yang Liu, Jian-Xun Wang | 15 | [论文链接](https://doi.org/10.1038/s41467-024-54712-1) <br> [代码仓库](https://github.com/jx-wang-s-group/CoNFILD) |

### 1.2 作者介绍
- **通讯作者**:Jian-Xun Wang(王建勋)<br> 所属机构:美国圣母大学航空航天与机械工程系、康奈尔大学机械与航空航天工程系<br> 研究方向:湍流建模、生成式AI、物理信息机器学习<br>

- **其他作者**:<br> Pan Du、Meet Hemant Parikh(共同一作):圣母大学博士生,研究方向为生成式模型与计算流体力学<br> Xiantao Fan、Xin-Yang Liu:圣母大学研究助理,负责数值模拟与数据生成

### 1.3 模型&复现代码
| 问题类型 | 在线运行 | 神经网络架构 | 评估指标 |
|------------------------|----------------------------------------------------------------------------------------------------------------------------|------------------------|-----------------------|
| 时空湍流生成 | [aistudio](https://aistudio.baidu.com/project/edit/9736790) | 条件神经场+潜在扩散模型 | MSE: 0.041(速度场) |

=== "模型训练命令"
```bash
python confild.py mode=train
```

=== "预训练模型快速评估"

``` sh
python confild.py mode=eval
```

## 2. 问题定义
### 2.1 研究背景
湍流模拟在航空航天、海洋工程等领域至关重要,但传统方法如直接数值模拟(DNS)和大涡模拟(LES)计算成本高昂,难以应用于高雷诺数或实时场景。现有深度学习模型多基于确定性框架,难以捕捉湍流的混沌特性,且在复杂几何域中表现受限。

### 2.2 核心挑战
1. **高维数据**:三维时空湍流数据维度高达 \(O(10^9)\),传统生成模型内存需求巨大。
2. **随机性建模**:需同时捕捉湍流的多尺度统计特性与瞬时动态。
3. **几何适应性**:需支持不规则计算域与自适应网格。

### 2.3 创新方法
提出**条件神经场潜在扩散模型(CoNFILD)**,通过三阶段框架解决上述挑战:
1. **神经场编码**:将高维流场压缩为低维潜在表示,压缩比达0.002%-0.017%。
2. **潜在扩散**:在潜在空间进行概率扩散过程,学习湍流统计分布。
3. **零样本条件生成**:结合贝叶斯推理,无需重新训练即可实现传感器重建、超分辨率等任务。

![图1 CoNFILD框架](./confild.png)
*框架示意图:CNF编码器将流场映射到潜在空间,扩散模型生成新潜在样本,解码器重建物理场*

## 3. 模型构建
### 3.1 条件神经场(CNF)
- **架构**:基于SIREN网络,采用正弦激活函数捕捉周期性特征。
- **数学表示**:
$$
\mathscr{E}(\mathbf{X},\mathbf{L}) = \text{SIREN}(\mathbf{x}) + \text{FILM}(\mathbf{L})
$$
其中FILM(Feature-wise Linear Modulation)通过潜在向量\(\mathbf{L}\)调节每层偏置。

### 3.2 潜在扩散模型
- **前向过程**:逐步添加高斯噪声,潜在表示\(\mathbf{z}_0 \rightarrow \mathbf{z}_T\)。
- **逆向过程**:训练U-Net预测噪声,通过迭代去噪生成新样本:
$$
\mathbf{z}_{t-1} = \frac{1}{\sqrt{\alpha_t}} \left( \mathbf{z}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \epsilon_\theta(\mathbf{z}_t, t) \right) + \sigma_t \epsilon
$$

### 3.3 零样本条件生成
- **贝叶斯后验采样**:基于稀疏观测\(\Psi\),通过梯度修正潜在空间采样:
$$
\nabla_{\mathbf{z}_t} \log p(\mathbf{z}_t|\Psi) \approx \nabla_{\mathbf{z}_t} \log p(\Psi|\mathbf{z}_t) + \nabla_{\mathbf{z}_t} \log p(\mathbf{z}_t)
$$

## 4. 问题求解
### 4.1 数据集准备
数据文件说明如下:
```
data # CNF的训练数据集
|
|-- data.npy # 要拟合的数据
|
|-- coords.npy # 查询坐标
```

在加载数据之后,需要进行normalization,以便于训练。具体代码如下:
```python linenums="39"
example/confild/confild.py:59:135
```

### 4.2 CoNFiLD 模型
CoNFiLD 模型基于贝叶斯后验采样,将稀疏传感器测量数据作为条件输入。通过训练好的无条件扩散模型作为先验,在扩散后验采样过程中,考虑测量噪声引入的不确定性。利用状态到观测映射,根据条件向量与流场的关系,通过调整无条件得分函数,引导生成与传感器数据一致的全时空流场实现重构,并且能提供重构的不确定性估计。代码如下:

```python linenums="39"
ppsci/arch/confild.py:304:420
```
为了在计算时,准确快速地访问具体变量的值,我们在这里指定网络模型的输入变量名是 ["confild_x", "latent_z"],输出变量名是 ["confild_output"],这些命名与后续代码保持一致。

4.3 模型训练、评估
完成上述设置之后,只需要将上述实例化的对象按照文档进行组合,然后启动训练、评估。
```python linenums="39"
examples/confild/confild.py:218:503
```

## 5. 实验结果
![](https://ai-studio-static-online.cdn.bcebos.com/1f81af1d579b4b41a525f867ac0fde19d59fb6fc44f8406aa84345c6015938c9)
119 changes: 119 additions & 0 deletions examples/confild/conf/confild_case1.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
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:
dir: outputs_confild_case1/${now:%Y-%m-%d}/${now:%H-%M-%S}/${hydra.job.override_dirname}
job:
name: ${mode}
chdir: false
callbacks:
init_callback:
_target_: ppsci.utils.callbacks.InitCallback
sweep:
dir: ${hydra.run.dir}
subdir: ./

mode: infer
seed: 2025
output_dir: ${hydra:run.dir}
log_freq: 20

TRAIN:
batch_size: 64
test_batch_size: 256
epochs: 9800
mutil_GPU: 1
lr:
cnf: 1.e-4
latents: 1.e-5

EVAL:
confild_pretrained_model_path: ./outputs_confild_case1/confild_case1/epoch_99999
latent_pretrained_model_path: ./outputs_confild_case1/latent_case1/epoch_99999

CONFILD:
input_keys: ["confild_x", "latent_z"]
output_keys: ["confild_output"]
num_hidden_layers: 10
out_features: 3
hidden_features: 128
in_coord_features: 2
in_latent_features: 128

Latent:
input_keys: ["latent_x"]
output_keys: ["latent_z"]
N_samples: 16000
lumped: True
N_features: 128
dims: 2

INFER:
Latent:
INFER:
pretrained_model_path: null
export_path: ./inference/latent_case1
pdmodel_path: ${INFER.Latent.INFER.export_path}.pdmodel
pdiparams_path: ${INFER.Latent.INFER.export_path}.pdiparams
onnx_path: ${INFER.Latent.INFER.export_path}.onnx
device: gpu
engine: native
precision: fp32
ir_optim: true
min_subgraph_size: 5
gpu_mem: 2000
gpu_id: 0
max_batch_size: 1024
num_cpu_threads: 10
log_freq: 20
Confild:
INFER:
pretrained_model_path: null
export_path: ./inference/confild_case1
pdmodel_path: ${INFER.Confild.INFER.export_path}.pdmodel
pdiparams_path: ${INFER.Confild.INFER.export_path}.pdiparams
onnx_path: ${INFER.Confild.INFER.export_path}.onnx
device: gpu
engine: native
precision: fp32
ir_optim: true
min_subgraph_size: 5
gpu_mem: 2000
gpu_id: 0
max_batch_size: 1024
num_cpu_threads: 10
coord_shape: [918, 2]
latents_shape: [1, 128]
log_freq: 20
batch_size: 64

Uncondiction_INFER:
batch_size : 16
test_batch_size : 16
time_length : 128
latent_length : 128
image_size : 128
num_channels: 128
num_res_blocks: 2
num_heads: 4
num_head_channels: 64
attention_resolutions: "32,16,8"
channel_mult: null
steps: 1000
noise_schedule: "cosine"

Data:
data_path: data/Case1/case1_data.npy
coor_path: data/Case1/case1_coords.npy
normalizer:
method: "-11"
dim: 0
load_data_fn: load_elbow_flow
103 changes: 103 additions & 0 deletions examples/confild/conf/confild_case2.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
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:
dir: ./outputs_confild_case2
job:
name: ${mode}
chdir: false
callbacks:
init_callback:
_target_: ppsci.utils.callbacks.InitCallback
sweep:
dir: ${hydra.run.dir}
subdir: ./

mode: infer
seed: 2025
output_dir: ${hydra:run.dir}
log_freq: 20

TRAIN:
batch_size: 10
test_batch_size: 10
epochs: 44500
mutil_GPU: 1
lr:
cnf: 1.e-4
latents: 1.e-5

EVAL:
confild_pretrained_model_path: ./outputs_confild_case2/confild_case2/epoch_99999
latent_pretrained_model_path: ./outputs_confild_case2/latent_case2/epoch_99999

CONFILD:
input_keys: ["confild_x", "latent_z"]
output_keys: ["confild_output"]
num_hidden_layers: 10
out_features: 4
hidden_features: 256
in_coord_features: 2
in_latent_features: 256

Latent:
input_keys: ["latent_x"]
output_keys: ["latent_z"]
N_samples: 1200
lumped: False
N_features: 256
dims: 2

INFER:
Latent:
INFER:
pretrained_model_path: null
export_path: ./inference/latent_case2
pdmodel_path: ${INFER.Latent.INFER.export_path}.pdmodel
pdiparams_path: ${INFER.Latent.INFER.export_path}.pdiparams
onnx_path: ${INFER.Latent.INFER.export_path}.onnx
device: gpu
engine: native
precision: fp32
ir_optim: true
min_subgraph_size: 5
gpu_mem: 2000
gpu_id: 0
max_batch_size: 1024
num_cpu_threads: 10
log_freq: 20
Confild:
INFER:
pretrained_model_path: null
export_path: ./inference/confild_case2
pdmodel_path: ${INFER.Confild.INFER.export_path}.pdmodel
pdiparams_path: ${INFER.Confild.INFER.export_path}.pdiparams
onnx_path: ${INFER.Confild.INFER.export_path}.onnx
device: gpu
engine: native
precision: fp32
ir_optim: true
min_subgraph_size: 5
gpu_mem: 2000
gpu_id: 0
max_batch_size: 1024
num_cpu_threads: 10
coord_shape: [400, 100, 2]
latents_shape: [1, 1, 256]
log_freq: 20
batch_size: 40

Data:
data_path: /home/aistudio/work/extracted/data/Case2/data.npy
normalizer:
method: "-11"
dim: 0
load_data_fn: load_channel_flow
Loading