ellipse code updates, added run-in-colab-links

This commit is contained in:
N_T committed 2025-01-27 15:06:59 +08:00
1 parent 458934b3c8
commit 38ca428a8a
4 files changed
+195 -140

No files matched your search

+1
View File
@@ -9,6 +9,7 @@
"# From DDPM to Flow Matching\n",
"\n",
"We'll be using a learning task where we can reliably generate arbitrary amounts of ground truth data, to make sure we can quantify how well the target distribution was learned. Specifically, we'll focus on Reynolds-averaged Navier-Stokes simulations around airfoils, which have the interesting characteristic that typical solvers (such as OpenFoam) transition from steady solutions to oscillating ones for larger Reynolds numbers. This transition is exactly what we'll give as a task to diffusion models below. (Details can be found in our [diffuion-based flow prediction repository](https://github.com/tum-pbs/Diffusion-based-Flow-Prediction/).) Also, to make the notebook self-contained, we'll revisit the most important concepts from the previous section.\n",
"[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/probmodels-ddpm-fm.ipynb)\n",
"\n",
"```{note} \n",
"If you're directly continuing reading from the previous chapter, note that there's an important difference: for simplicity, we'll apply denoising and flow-matching to a **forward** problem here. We won't be aiming to recover $x$ for an observation $y$, but rather assume we have initial conditions $x$ from which we want to compute a solution $y$. So don't be surprised by the switched $x$ and $y$ below.\n",
+190 -139
View File
@@ -2,12 +2,14 @@
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "yfBkJ3nSV7gY"
},
"source": [
"Distributional Accuracy of Diffusion Graph Nets\n",
"-----------------------------------------------\n",
"# Distributional Accuracy of Diffusion Graph Nets\n",
"\n",
"The following notebook shows how to run and evaluate trained diffusion graph net models (DGNs). It also evaluates the accuracy of the inferred distributions in comparison to popular baselines. In the experiments here, the training trajectories are intentionally short. Specifically, the trajectories are too short to cover one full oscillation period, meaning they do not explicitly provide full statistical information about the systems.\n",
"[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/probmodels-graph-ellipse.ipynb)\n",
"\n",
"```{admonition} Learning with Partial Statistics\n",
":class: tip\n",
@@ -31,7 +33,9 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "7rxDN82ZV7gZ"
},
"source": [
"## Implementation\n",
"\n",
@@ -42,34 +46,70 @@
"cell_type": "code",
"execution_count": 1,
"metadata": {
"metadata": {}
"metadata": {},
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputs": [],
"id": "g8UeRkXvV7ga",
"outputId": "35219fb6-94a0-46f2-b811-ecfee017e214"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/897.5 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[91m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[91m╸\u001b[0m \u001b[32m890.9/897.5 kB\u001b[0m \u001b[31m44.2 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m897.5/897.5 kB\u001b[0m \u001b[31m25.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25h"
]
}
],
"source": [
"import numpy as np\n",
"import torch, tqdm\n",
"from torchvision import transforms\n",
"import matplotlib.pyplot as plt\n",
"device = torch.device('cuda:0')"
"device = torch.device('cuda:0')\n",
"\n",
"try:\n",
" import google.colab # to ensure that we are inside colab\n",
" !pip install --upgrade --quiet torch_geometric bayesian_torch pot\n",
"except ImportError:\n",
" print('This notebook is running locally, please make sure the necessary pip packages are installed.')\n",
" pass"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"metadata": {}
"metadata": {},
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputs": [],
"id": "AEmOzgK9V7ga",
"outputId": "51f5e3a1-b3b9-4c1f-f125-1c00cde5ea85"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"/content/dgn4cfd\n"
]
}
],
"source": [
"# NT_DEBUG, todo, install\n",
"# ! git clone https://github.com/tum-pbs/dgn4cfd\n",
"# % cd dgn4cfd/\n",
"# clone respository, note - deactivate for local installs\n",
"!git clone https://github.com/tum-pbs/dgn4cfd\n",
"%cd dgn4cfd/\n",
"import dgn4cfd as dgn"
]
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "n0ziIcljV7ga"
},
"source": [
"To keep runtimes of this notebook low, we'll simply load pre-trained models from the repository. We'll compare the following variants:\n",
"- Diffusion Graph Net (DGN)\n",
@@ -89,66 +129,69 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 7,
"metadata": {
"metadata": {}
"metadata": {},
"id": "VKm0gugyV7ga"
},
"outputs": [],
"source": [
"# Diffusion Graph Net\n",
"DGN = dgn.nn.DiffusionGraphNet(\n",
" checkpoint = \"./checkpoints/dgn-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/dgn-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Latent Diffusion Graph Net\n",
"LDGN = dgn.nn.LatentDiffusionGraphNet(\n",
" autoencoder_checkpoint = \"./checkpoints/ae-nt10.chk\",\n",
" checkpoint = \"./checkpoints/ldgn-nt10.chk\",\n",
" autoencoder_checkpoint = \"./examples/Ellipse/checkpoints/ae-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/ldgn-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Vanilla Graph Net\n",
"VanillaGN = dgn.nn.VanillaGnn(\n",
" checkpoint = \"./checkpoints/vanilla-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/vanilla-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Bayesian Graph Net\n",
"BayesianGN = dgn.nn.BayesianGnn(\n",
" checkpoint = \"./checkpoints/bayesian-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/bayesian-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Gassian Mixure Graph Net\n",
"GaussianMixGN = dgn.nn.GaussianMixtureGnn(\n",
" checkpoint = \"./checkpoints/gaussian-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/gaussian-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Variational Graph Autoencoder\n",
"VGAE = dgn.nn.VGAE(\n",
" checkpoint = \"./checkpoints/vgae-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/vgae-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Flow-Matching Graph Net\n",
"FMGN = dgn.nn.FlowMatchingGraphNet(\n",
" checkpoint = \"./checkpoints/fmgn-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/fmgn-nt10.chk\",\n",
" device = device,\n",
")\n",
"\n",
"# Latent Flow-Matching Graph Net\n",
"LFMGN = dgn.nn.LatentFlowMatchingGraphNet(\n",
" autoencoder_checkpoint = \"./checkpoints/ae-nt10.chk\",\n",
" checkpoint = \"./checkpoints/lfmgn-nt10.chk\",\n",
" autoencoder_checkpoint = \"./examples/Ellipse/checkpoints/ae-nt10.chk\",\n",
" checkpoint = \"./examples/Ellipse/checkpoints/lfmgn-nt10.chk\",\n",
" device = device,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "YXKk7INgV7gb"
},
"source": [
"As a next step, we need a test dataset to evaluate our models with. The `dgn4cfd` codebase contains several test and training data sets, but we'll use the `pOnEllipseInDist` dataset which contains partial distributions (similar to the training data), but with unseen conditions. We'll also load the `TimeEllipseInDist` dataset, which contains more samples and will provide a ground truth distribution for the evaluation.\n",
"\n",
@@ -157,18 +200,25 @@
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": 8,
"metadata": {
"metadata": {}
"metadata": {},
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IFPW3RqdV7gb",
"outputId": "65a383ab-54ee-4c96-b49c-c186755422b6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"Dataset already exists.\n",
"Downloading dataset from https://huggingface.co/datasets/mariolinov/Ellipse/resolve/main/pOnEllipseInDist.h5...\n",
"Dataset downloaded.\n",
"Number of samples: 50\n",
"Dataset already exists.\n"
"Downloading dataset from https://huggingface.co/datasets/mariolinov/Ellipse/resolve/main/TimeEllipseInDist.npy...\n",
"Dataset downloaded.\n"
]
}
],
@@ -202,8 +252,11 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "cBAyoKyZV7gc"
},
"source": [
"## Sample-wise Accuracy\n",
"The next cell defines a plotting function that shows the closest ground truth pressure distribution that was found in the reference data set in black next to the neural network outputs, shown in light red.\n",
"\n",
"The `SIM_IDX` variable chooses a specific flow condition from the test data set (feel free to try others)."
@@ -211,9 +264,10 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 9,
"metadata": {
"metadata": {}
"metadata": {},
"id": "Os9aIglCV7gc"
},
"outputs": [],
"source": [
@@ -239,39 +293,48 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "6qBhwbOVV7gc"
},
"source": [
"The next cell creates a 3x3 grid of graphs with the `plot()` function. The first row will contain the DGN models, and the vanilla GN. The next row will show flow-matching in direct comparison to the DDPM versions in the first row, while the last one will contain the outputs of the remaining three baseline."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "HfJ_lK5QV7gc",
"outputId": "8aef4489-0f83-4492-8def-ffe84f1f85b9"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"DGN R2 = 0.9871 at t=31\n",
"LDGN R2 = 0.9987 at t=42\n",
"DGN R2 = 0.9986 at t=74\n",
"LDGN R2 = 0.9976 at t=15\n",
"Vanilla Graph Net R2 = 0.9912 at t=6\n",
"Flow-Matching Graph Net R2 = 0.9970 at t=27\n",
"Latent Flow-Matching Graph Net R2 = 0.9985 at t=19\n",
"Bayesian Graph Net R2 = 0.9830 at t=67\n",
"Gaussian Mixture Graph Net R2 = 0.9690 at t=29\n",
"VGAE R2 = 0.9914 at t=55\n"
"Flow-Matching Graph Net R2 = 0.9957 at t=28\n",
"Latent Flow-Matching Graph Net R2 = 0.9983 at t=50\n",
"Bayesian Graph Net R2 = 0.9820 at t=67\n",
"Gaussian Mixture Graph Net R2 = 0.9799 at t=28\n",
"VGAE R2 = 0.9994 at t=36\n"
]
},
{
"output_type": "display_data",
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 1400x1400 with 9 Axes>"
]
],
"image/png": "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 truncated
},
"metadata": {},
"output_type": "display_data"
"metadata": {}
}
],
"source": [
@@ -376,7 +439,9 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "bwfY6tEYV7gd"
},
"source": [
"There are a lot of graphs here, but they show several interesting aspects:\n",
"* First of all, the DGN and its FM variants produce very accurate pressure distributions; typically only the DGN version is slightly noise with the default settings (the latent space model LDGN already performs better).\n",
@@ -389,7 +454,9 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "3WjCrVN1V7gd"
},
"source": [
"## Evaluating Distributional Accuracy\n",
"\n",
@@ -401,8 +468,10 @@
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"execution_count": 11,
"metadata": {
"id": "bHtJzPlOV7gd"
},
"outputs": [],
"source": [
"from scipy.stats import gaussian_kde\n",
@@ -433,146 +502,142 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "t36pDFd0V7ge"
},
"source": [
"We'll use `NUM_SAMPLES = 200` below, and plot the distributions for ground truth and the 8 models below."
]
},
{
"cell_type": "code",
"execution_count": 36,
"execution_count": 12,
"metadata": {
"metadata": {}
"metadata": {},
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"id": "1g-xBDXoV7ge",
"outputId": "38a28f47-143e-4896-cd8c-f25ac95aa288"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"name": "stderr",
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"DGN\n",
"R2 of mean: 0.9979 R2 of std: 0.9795\n",
"Wasserstein-2 distance 1d: 0.0143\n",
"Wasserstein-2 distance nd: 0.1854\n"
"R2 of mean: 0.9989 R2 of std: 0.9814\n",
"Wasserstein-2 distance 1d: 0.0116\n",
"Wasserstein-2 distance nd: 0.1536\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"LDGN\n",
"R2 of mean: 0.9987 R2 of std: 0.9650\n",
"Wasserstein-2 distance 1d: 0.0126\n",
"Wasserstein-2 distance nd: 0.1455\n"
"R2 of mean: 0.9986 R2 of std: 0.9614\n",
"Wasserstein-2 distance 1d: 0.0143\n",
"Wasserstein-2 distance nd: 0.1787\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"Flow-Matching DGN\n",
"R2 of mean: 0.9979 R2 of std: 0.4831\n",
"Wasserstein-2 distance 1d: 0.0221\n",
"Wasserstein-2 distance nd: 0.2149\n"
"R2 of mean: 0.9976 R2 of std: 0.4237\n",
"Wasserstein-2 distance 1d: 0.0235\n",
"Wasserstein-2 distance nd: 0.2256\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"Latent Flow-Matching DGN\n",
"R2 of mean: 0.9988 R2 of std: 0.8086\n",
"Wasserstein-2 distance 1d: 0.0150\n",
"Wasserstein-2 distance nd: 0.1568\n"
"R2 of mean: 0.9985 R2 of std: 0.8425\n",
"Wasserstein-2 distance 1d: 0.0154\n",
"Wasserstein-2 distance nd: 0.1635\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 200/200 [00:03<00:00, 54.93it/s]\n"
"100%|██████████| 200/200 [00:04<00:00, 43.76it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"Bayesian Graph Net\n",
"R2 of mean: 0.9983 R2 of std: -0.8248\n",
"Wasserstein-2 distance 1d: 0.0358\n",
"Wasserstein-2 distance nd: 0.5815\n"
"R2 of mean: 0.9980 R2 of std: -0.6514\n",
"Wasserstein-2 distance 1d: 0.0363\n",
"Wasserstein-2 distance nd: 0.5987\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"Gaussian Mixture Graph Net\n",
"R2 of mean: 0.9717 R2 of std: 0.1322\n",
"Wasserstein-2 distance 1d: 0.0528\n",
"Wasserstein-2 distance nd: 0.7149\n"
"R2 of mean: 0.9708 R2 of std: 0.1079\n",
"Wasserstein-2 distance 1d: 0.0535\n",
"Wasserstein-2 distance nd: 0.7174\n"
]
},
{
"output_type": "stream",
"name": "stderr",
"output_type": "stream",
"text": [
" \r"
]
"text": []
},
{
"name": "stdout",
"output_type": "stream",
"name": "stdout",
"text": [
"VGAE\n",
"R2 of mean: 0.9986 R2 of std: 0.9365\n",
"Wasserstein-2 distance 1d: 0.0136\n",
"Wasserstein-2 distance nd: 0.2303\n"
"R2 of mean: 0.9994 R2 of std: 0.8818\n",
"Wasserstein-2 distance 1d: 0.0130\n",
"Wasserstein-2 distance nd: 0.2050\n"
]
},
{
"output_type": "display_data",
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 1400x1400 with 9 Axes>"
]
],
"image/png": "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 truncated
},
"metadata": {},
"output_type": "display_data"
"metadata": {}
}
],
"source": [
@@ -725,14 +790,9 @@
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n"
]
"metadata": {
"id": "zgGo2-XGV7ge"
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, the ground truth distribution is worth a closer look: it's a bi-modal distribution, caused by the recurring vortex shedding behind the ellipse. Hence, it's important for models to capture the two extremes (regions with higher density), as well as the less dense inner part. Comparing the GT version with the distributions of the different approaches shows that the DGN methods faithfully reproduce the distribution. The noise of the regular DGN averages out to some extent here, it can even exhibit a performance that surpasses the LDGN version. As before, flow matching can produce these distributions at a fraction of the cost, and hence is generally preferable.\n",
"\n",
@@ -740,26 +800,11 @@
"\n",
"The graph-based Wasserstein distance largely captures the intuition behind the observations above, but fails to illustrate how well outer (and inner) parts of the distribution are matched. Nonetheless, it's of course crucial as a tool for higher-dimensional distributions such as those of the 3D wing case from the previous page.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
@@ -773,8 +818,14 @@
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
}
},
"colab": {
"provenance": [],
"machine_shape": "hm",
"gpuType": "A100"
},
"accelerator": "GPU"
},
"nbformat": 4,
"nbformat_minor": 4
"nbformat_minor": 0
}
+1
View File
@@ -11,6 +11,7 @@
"=======================\n",
"\n",
"This notebook will illustrate some of the concepts introduced in {doc}`probmodels-intro`, such as the training of score functions via log likelihoods, and what they look like in a clear and reduced problem. At the same time, the setup provides integration of a simple _differentiable simulator_ to illustrate the concept of physics-based diffusion modeling with the SMDP method from {doc}`probmodels-phys` [(full paper)](https://arxiv.org/abs/2301.10250). This approach combines physics and score matching along a merged time dimension to solve inverse problems. \n",
"[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/probmodels-sbisim.ipynb)\n",
"\n",
"## Toy Problem setup\n",
"\n",
+3 -1
View File
@@ -20,7 +20,9 @@
"This motivates - as in the previous sections - to view the steps of a time series as a probabilistic distribution over time rather than a deterministic series of states.\n",
"A probabilistic simulator can learn to take into account the influence of the un-observed state, and infer solutions from variations of this un-observed part of the system. Worst case, if this un-observed state has a negligible influence, we should see a mean state with an variance that's effectively zero. So there's nothing to loose! \n",
"\n",
"The following notebook introduces an effective, distribution-based approach for temporal predictions:\n",
"The following notebook \n",
"[[run in colab]](https://colab.research.google.com/github/tum-pbs/pbdl-book/blob/main/probmodels-time.ipynb)\n",
" introduces an effective, distribution-based approach for temporal predictions:\n",
"* conditional diffusion models are used to compute autoregressive rollouts to obtain a \"probabilistic simulator\"; \n",
"* it is of course highly interesting to compare this diffusion-based predictor to the deterministic baselines and neural operators from the previous chapters;\n",
"* in order to evaluate the results w.r.t. their accuracy, we'll employ a transonic fluid flow for which we can compute statistics from a simulated reference.\n",