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
+212 -157

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",
+207 -156
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",
"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",
@@ -23,7 +25,7 @@
"---\n",
"The `Ellipse` tasks focuses on predicting samples from the pressure distribution on the surface of a elliptical obstacle immersed in a fluid. The trained models should directly predict samples on the surface, without resolving the far field or the initial transient phase of the flow.\n",
"```\n",
"It's important to keep in mind that we don't resolve the full flow of time with this method (this was the task in {doc}`probmodels-time`). Rather, the goal is to very efficiently obtain samples from the equilibrium state of the simulation, as prescribed by the trianing data, not to resolve the evolution of an initial condition over time. A consequence is that trained models work on a graph that describes the geometry of the ellipse, but they are agnostic to time. They simply produce _one_ sample of the distribution of states of time. \n",
"It's important to keep in mind that we don't resolve the full flow of time with this method (this was the task in {doc}`probmodels-time`). Rather, the goal is to very efficiently obtain samples from the equilibrium state of the simulation, as prescribed by the trianing data, not to resolve the evolution of an initial condition over time. A consequence is that trained models work on a graph that describes the geometry of the ellipse, but they are agnostic to time. They simply produce _one_ sample of the distribution of states of time.\n",
"\n",
"This in turn makes it more difficult to evaluate how closely a computed sample aligns with the ground truth: we don't know which sample out of the full distribution was generated! Thus, for a good test evaluation, it's important to have a densely sampled ground truth distribution, and for each sample inferred by a trained network, we'll search for the closest one in the test data set for the chosen input geometry. This can leave a small \"discretization error\" due to the discrete samples in the test set. It will nonetheless provide a good estimate of the distributional accuracy when enough samples are used on both sides, in terms of the test set itself, and the model outputs.\n",
"\n"
@@ -31,45 +33,83 @@
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {
"id": "7rxDN82ZV7gZ"
},
"source": [
"## Implementation\n",
"\n",
"The following notebook uses the `dgn4cfd` [code](https://github.com/tum-pbs/dgn4cfd/), and hence we'll import some basic libraries and clone the `dgn4cfd` repo below. \n"
"The following notebook uses the `dgn4cfd` [code](https://github.com/tum-pbs/dgn4cfd/), and hence we'll import some basic libraries and clone the `dgn4cfd` repo below.\n"
]
},
{
"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",
"import dgn4cfd as dgn "
"# 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",
"\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,24 +200,31 @@
},
{
"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"
]
}
],
"source": [
"DATASET = dgn.datasets.DatasetUrl.pOnEllipseInDist\n",
"TIME_DATASET = dgn.datasets.DatasetUrl.TimeEllipseInDist \n",
"TIME_DATASET = dgn.datasets.DatasetUrl.TimeEllipseInDist\n",
"\n",
"# Training dataset\n",
"transform = transforms.Compose([\n",
@@ -187,7 +237,7 @@
" dgn.transforms.MeshCoarsening( # Create 3 lower-resolution graphs and normalise the relative position betwen the inter-graph nodes.\n",
" num_scales = 4,\n",
" rel_pos_scaling = [0.02, 0.06, 0.15, 0.3],\n",
" scalar_rel_pos = True, \n",
" scalar_rel_pos = True,\n",
" ),\n",
"])\n",
"dataset = dgn.datasets.pOnEllipse(\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,48 +293,57 @@
},
{
"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": [
"# denoising steps \n",
"# denoising steps\n",
"NUM_DENOISING_STEPS = 50\n",
"# flow matching steps\n",
"NUM_FM_STEPS = int(NUM_DENOISING_STEPS/10)+1\n",
"\n",
"fig, ax = plt.subplots(3, 3, figsize=(14, 14)) \n",
"fig, ax = plt.subplots(3, 3, figsize=(14, 14))\n",
"ax = ax.flatten()\n",
"curr_ax = 0\n",
"\n",
@@ -290,7 +353,7 @@
"steps = dgn.nn.diffusion.DiffusionStepsGenerator('linear', DGN.diffusion_process.num_steps)(NUM_DENOISING_STEPS)\n",
"pred = DGN.sample(graph, steps=steps)\n",
"# Compute the accuracy\n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)] \n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)]\n",
"r2, t = np.max(r2), np.argmax(r2)\n",
"print(f\"DGN R2 = {r2:.4f} at t={t}\")\n",
"# Plot the results\n",
@@ -300,7 +363,7 @@
"# LDGN inference\n",
"steps = dgn.nn.diffusion.DiffusionStepsGenerator('linear', DGN.diffusion_process.num_steps)(NUM_DENOISING_STEPS)\n",
"pred = LDGN.sample(graph, steps=steps)\n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)] \n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)]\n",
"r2, t = np.max(r2), np.argmax(r2)\n",
"print(f\"LDGN R2 = {r2:.4f} at t={t}\")\n",
"plot(ax[curr_ax],graph.pos, graph.target[:,t], pred, r2, \"LDGN\")\n",
@@ -310,7 +373,7 @@
"with torch.no_grad():\n",
" VanillaGN.eval()\n",
" pred = VanillaGN(graph)\n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)] \n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)]\n",
"r2, t = np.max(r2), np.argmax(r2)\n",
"print(f\"Vanilla Graph Net R2 = {r2:.4f} at t={t}\")\n",
"plot(ax[curr_ax], graph.pos, graph.target[:,t], pred, r2, \"Vanilla GNN\")\n",
@@ -329,7 +392,7 @@
"\n",
"# Latent Flow-Matching Graph Net inference\n",
"steps = np.linspace(0, 1, NUM_FM_STEPS)\n",
"pred = LFMGN.sample(graph, steps=steps) \n",
"pred = LFMGN.sample(graph, steps=steps)\n",
"r2 = [dgn.metrics.r2_accuracy(pred, target) for target in graph.target.split(1, dim=1)]\n",
"r2, t = np.max(r2), np.argmax(r2)\n",
"print(f\"Latent Flow-Matching Graph Net R2 = {r2:.4f} at t={t}\")\n",
@@ -337,7 +400,7 @@
"curr_ax += 1\n",
"\n",
"# skip one cell\n",
"curr_ax += 1 \n",
"curr_ax += 1\n",
"\n",
"# Other baselines following\n",
"\n",
@@ -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,153 +502,149 @@
},
{
"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": "iVBORw0KGgoAAAANSUhEUgAABJQAAARwCAYAAAC8fw7RAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdebyM5f8/8Nfs+5w5q4PIlqWSJVGWb9YWJZESCvWppCgqbSq0U59ESrSgbKWipBRCRGVNKoRjP/s2c2Zf7t8ffvf9mTlnznH2mTnn9Xw87odzz9xzzzUc73vu93Vd70smCIIAIiIiIiIiIiKicpJHugFERERERERERBRbmFAiIiIiIiIiIqIKYUKJiIiIiIiIiIgqhAklIiIiIiIiIiKqECaUiIiIiIiIiIioQphQIiIiIiIiIiKiCmFCiYiIiIiIiIiIKoQJJSIiIiIiIiIiqhBlpBtARERERCWdOnUKBw8eRE5ODnJycuB2uxEXFweLxYJLLrkE7du3h1arjXQziYgoAgRBwMGDB3H8+HHpOiGTyWCxWJCQkIDLLrsMbdq0gVzOMSRUc5hQqmc8Hg/27NmDs2fPIicnB3l5edBqtbBYLEhJSUHHjh1x0UUXRbqZVE1kMpn087Rp0zB9+vTINaaeWLx4Me655x5pPy0tDc2aNYtcg4jogk6cOIHmzZuXeYxarYZWq0ViYiJSU1PRunVrdOjQAf/3f/+Hzp07h8Tbqjhy5Ajeeecd/Pjjjzhy5EiZxyqVSnTo0AFDhgzB7bffjtatW1/w/KV91k2bNqFv377lbmfxWLd69Wrceuut5X49EVFNKB7jrr32WmzZsqVK5ywe74qTyWRQq9XQ6/VITk5G48aN0a5dO3Tu3Bl9+vRBixYtqvT+xW3atAkff/wxNm7ciKysrDKP1ev16NGjB4YNG4YhQ4YgOTn5gucP93nj4uKQlpaG+Pj4crdz7NixWLJkibSfn58Pi8VS7tdTbGBCKQqJ/4mrIwACgM/nwyeffIIvvvgCW7duhcPhKPP4pKQkXHfddRg2bBhuvPFG9n4SxYDevXtj69atWLRoEcaOHRvp5hDVOR6PBx6PB1arFWlpadi5c6f0XJMmTTBmzBhMmDABDRo0qNT5z507h6lTp+LTTz+F3+8v12t8Ph/27NmDPXv24LnnnsNNN92EadOm4aqrrqrw+0+dOjXkMxERUfkIggC32w232438/HwcOXIEmzdvlp7v3LkzHnjgAYwZM6ZK91W7du3ClClTsHXr1nK/xuFwYMOGDdiwYQMeeeQR3HfffXj66acrPICgsLAQs2bNwmuvvVbRZlMdx4RSHbdixQo8//zzOHbsWLlfk5OTg+XLl2P58uVISUnBlClTMH78eBgMhhpsKcWa4NFOvXv3Ru/evSPWluq2f/9+rFmzRtqfNGkSe1SI6hmFQhGyHwgEIAhC2GNPnz6Nl19+GbNnz8aMGTPw2GOPVWjE0u7du3HLLbcgPT095HGZTIYrrrgC7du3R2JiIsxmM3JycpCRkYE//vgDx48fDzl+3bp1WLduHXw+X4n2X8ivv/6Kb7/9FjfffHOFXkdEVN/IZLIS08jK6gjYu3cvHnzwQbz22muYP38+brzxxgq/5+LFizFu3Dh4PJ6QxzUaDa6++mo0b94cSUlJ0Gg0yMjIQEZGBnbu3Im8vDzpWLfbjXfffRd//PEHtm3bVuE2zJ07F5MmTap0xwnVTUwo1VE+nw+PPPII5s+fX+K5+Ph49OjRAw0bNkRycjK8Xi8yMjJw+vRp7Ny5E263Wzo2KysLU6ZMQWFhIV566aXa/AgU5WbMmBGyX9cSSsGfb+zYsUwoEdUj4UYIC4IAq9WK/Px8aYTSTz/9hE2bNknH2O12PPHEE9i2bRtWrVoFlUp1wffauHEjBg8eHDJ6OCkpCc888wzuvvvuMqcn/P333/jyyy8xZ84c5ObmhrS1Mp5//nncdNNN1TZ9j4ioLnrhhRdKlJHw+/0oKChAfn4+/vrrL+zcuRPffvst/vrrL+mYkydP4qabbsJrr72Gp556qtzv9+qrr2Lq1Kkhj1122WWYPn06brrpJuh0urCv8/v92LFjB5YuXYpFixbB6/UCqPw1wuFw4NVXX8WcOXMq9Xqqm1ihK0L8fj/ee++9Elnm8vjpp5+wb9++Ms99yy23lEgmDRw4EL/88gtycnKwdu1aLFy4EK+88gpmzZqFTz75BJs3b0Zubi7WrFmD6667LuS1lQ08RFR99u7di59++qnCr/N4PJg/f365p9EQUUkymQxxcXFo1qwZ+vTpg2effRYbN27EwYMHS9QO+vrrr/Hwww9f8Jxnz57FiBEjQpJJgwYNwvHjx/HYY49dsNbFpZdeiueffx5paWmYPn06NBpNhT+XUvm/vsX9+/dj1apVFT4HEVF9p1AokJiYiFatWmHw4MF4/fXXcfDgQaxfvx7t27eXjhMEAU8//TSWL19ervOuX78ezz33XMhjM2bMwIEDBzBs2LBSk0lim3r16oUFCxbgyJEjGDVqVKU+W/B1YsGCBTh9+nSlzkN1ExNKEbJgwQI8/PDDuOKKK0J6N8uSmZmJu+66C/369cP48eNLTfI899xz+P7776V9g8GAtWvXYt26dejevXuZlf4NBgMGDx6MH374Adu2bUPXrl0r9sGIqEYIgoDx48ejX79+uOuuu5CZmVmu123atAlXXHEFHnroISxcuLCGW0lU/1x22WVYvXo13nzzzZCRPR988AEWLFhQ5mtHjBiBnJwcaf+OO+7A6tWrYTKZKtQGk8mEadOmYfv27RVeBOD2228PmdL+wgsvMPlMRFRNrr/+evz6668YPnx4yOP33nsvDhw4UOZrMzMzcffdd4fc882dOxcvvPBChVdua9asGZYuXYolS5ZUuIxJcIFut9tdYpYC1W9MKEWIuKTj4cOH0b9/f4waNQoZGRlhjw0EAnj33XfRpk0bLFu2DMD5AqA2m63EsRs3bsTMmTOlfa1Wi59++qlSNRF69uyJ7du3Y/LkyRz+ThRhNpsNTZs2BQAsW7YMbdq0wXvvvYdAIBD2+IyMDIwcORL9+/fH4cOHOWWPqIY9/vjjePzxx0MemzFjRsg08mDr168PqWHRpEkTLFy4sMK1j4J16dIF+/btq9A5UlJS8Oijj0r7hw8fxieffFLpNhARUSi9Xo+lS5fimmuukR5zu90XXH159uzZIZ0Ot9xyCyZOnFiltowePRorVqyo0GsGDhyI7t27S/tLlizBv//+W6V2UN3BhFKEjB8/HseOHcOkSZOgVquxfPlytG3bFvPmzQu5Qdy9eze6du2KCRMmoLCwED179sTOnTuxatUqmM3mEud97rnnQrLYr776apVGGalUKrz11luYPHlypc9BRFVnNpuxatUq7Ny5Ez179kRhYSEefvhhdOvWDbt375aOCwQCmDdvHtq2bYsVK1ZArVZj0qRJOHbsGMaPHx/BT0BU97322mto27attJ+eno6PPvoo7LFvvPFGidfGxcVVuQ0Wi6XCnUBTpkwJSTrPmDGjUlPyiYgoPKVSieXLl4dMH1uzZk1IjaVgNpsN77//vrSvUCjwzjvvVEtbEhISKvyaV155RfrZ5/Nh2rRp1dIWin0syh1BCQkJmD17Nh555BE8++yz+OyzzzBx4kQpUbRnzx5069YNgUAAbdq0weuvv16iTkOwbdu24bfffpP2W7duHdLrWNW2VpbL5cK2bdtw+vRpZGZmQqfTYeDAgWjdunWpr8nOzsb27duRnp6OgoICWCwWNGrUCD179kRSUlKl2xIJ+/btw19//YWzZ89Cq9WiSZMm6N27d5X+Tm02G3766SecOnUKTqcTjRs3Rrt27dC5c+dqbHlkVOb3JZacPHkSv//+O06fPo1AIIAGDRqgZ8+eaN68eblef/XVV2Pbtm1Ys2YNnnnmGezevRvdunWDXq8HAEyePBlWqxUymQzDhw/Hq6++ihYtWtTkRyKi/0+pVOKRRx7BQw89JD326aefhuwDQFpaWkg9tMTERAwbNqzW2lmcxWLBE088IdXpOHnyJD744INy1YEiIqLyadasGYYOHYrPP/8cwPlyBkuXLsVrr71W4tgvv/wShYWF0v4NN9wgjVSPhN69e6N///7YuHEjAOCzzz7DM888E1IfiuopgaLGrl27hD59+ggApK1BgwbCe++9J3i93gu+fsyYMSGvfeONN2qh1ecFv++0adMEQRCEvLw8Ydy4cYLZbA55HoAwe/bssOfZsGGD0KNHD0Emk5V4DQBBLpcLvXr1ErZs2VKudi1atCjk9WlpaeV6XVpaWsjrFi1aVOqxwX/vF198sfT4F198IVx++eWlfo4xY8YIGRkZ5WqPKC8vT3jggQcErVYb9ryXXnqp8Nlnn0nHh/t3qYriv2Pl2caMGVPiPFX5fdm8eXPIc5s3by53+y/091HRzxbu/Uv7nTtw4IAwYMCAUn+3e/XqJezdu7fcn0UQBMHr9Qrz588XUlNTQ8517bXXCr///nuFzkVUnxWP+ddee22lz2Wz2QSlUimdS6VSCXa7PeSYxYsXh7zff/7znyp+gvIr/lkfffRRqd3JycnS4w0bNhQcDkep5yke61avXl07H4CIqAzVGc9FxeNdVb5Tr1+/PuRc3bt3D3vc2LFjQ4779NNPK/2eFVVafP/1119DHh88eHCZ5yl+35Cfn1/jbafaxylvUUQul4cdpl7a48Vt3bo1ZP/OO++strZV1P79+9GhQwcsWLAAVqv1gsf7fD7cc889GDBgAH755ZdSC44HAgFs27YNvXv3xvjx46OycKggCHjkkUcwbNgwHDx4MOwxgUAAS5YsQY8ePXDq1KlynffQoUO4/PLLsXDhQrhcrrDH/P333xg+fHi1jUyrLRX9fYk1n376Kbp27YoNGzaU+ru9bds29OzZExs2bCj3eWUyWdhaKTKZrMLFGomoehiLine truncated
"text/plain": [
"<Figure size 1400x1400 with 9 Axes>"
]
],
"image/png": "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 truncated
},
"metadata": {},
"output_type": "display_data"
"metadata": {}
}
],
"source": [
"NUM_SAMPLES = 200\n",
"BATCH_SIZE = 200 # Number of samples generated in parallel. Reduce this number if you run out of memory.\n",
"\n",
"fig, ax = plt.subplots(3, 3, figsize=(14, 14)) \n",
"fig, ax = plt.subplots(3, 3, figsize=(14, 14))\n",
"ax = ax.flatten()\n",
"curr_ax = 0\n",
"\n",
@@ -672,7 +737,7 @@
" pred_list.append(\n",
" BayesianGN.sample(graph).cpu()\n",
" )\n",
"pred = torch.concatenate(pred_list, dim=1) \n",
"pred = torch.concatenate(pred_list, dim=1)\n",
"mean = pred.mean(dim=1)\n",
"std = pred.std (dim=1)\n",
"# Compute the accuracy of the mean and std\n",
@@ -725,41 +790,21 @@
},
{
"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",
"The problems of the Baysian NN and the Gaussian mixture model very clearly show up in their distributions. The problems of the VGAE approach show up more clearly here: it has mode-collapse issues, which are even more severe in more complex scenarios.\n",
"\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"
"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",