Building your diffusion posterior sampling method using SDEs#

This demo shows you how to use deepinv.sampling.PosteriorDiffusion to perform posterior sampling. It also can be used to perform unconditional image generation with arbitrary denoisers, if the data fidelity term is not specified.

This method requires:

The deepinv.sampling.PosteriorDiffusion class can be used to perform posterior sampling for inverse problems. Consider the acquisition model:

\[y = \noise{\forw{x}}\]

where \(\forw{x}\) is the forward operator (e.g., a convolutional operator) and \(\noise{\cdot}\) is the noise operator (e.g., Gaussian noise). This class defines the reverse-time SDE for the posterior distribution \(p(x|y)\) given the data \(y\):

\[d\, x_t = \left( f(x_t, t) - \frac{1 + \alpha}{2} g(t)^2 \nabla_{x_t} \log p_t(x_t | y) \right) d\,t + g(t) \sqrt{\alpha} d\, w_{t}\]

where \(f\) is the drift term, \(g\) is the diffusion coefficient and \(w\) is the standard Brownian motion. The drift term and the diffusion coefficient are defined by the underlying (unconditional) forward-time SDE sde. In this example, we will use 2 well-known SDE in the literature: the Variance-Exploding (VE) and Variance-Preserving (VP or DDPM).

The (conditional) score function \(\nabla_{x_t} \log p_t(x_t | y)\) can be decomposed using the Bayes’ rule:

\[\nabla_{x_t} \log p_t(x_t | y) = \nabla_{x_t} \log p_t(x_t) + \nabla_{x_t} \log p_t(y | x_t).\]

The first term is the score function of the unconditional SDE, which is typically approximated by an MMSE denoiser (denoiser) using the well-known Tweedie’s formula, while the second term is approximated by the (noisy) data-fidelity term (data_fidelity). We implement various data-fidelity terms in the user guide.

Note

In this demo, we limit the number of diffusion steps for the sake of speed, but in practice, you should use a larger number of steps to obtain better results.


Let us import the necessary modules, define the denoiser and the SDE.

In this first example, we use the Variance-Exploding SDE, whose forward process is defined as:

\[d\, x_t = g(t) d\, w_t \quad \mbox{where } g(t) = \sigma_{\mathrm{min}}\left( \frac{\sigma_{\mathrm{max}}}{\sigma_{\mathrm{min}}}\right)^t\]
import torch
import deepinv as dinv
from deepinv.models import NCSNpp

device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float64
figsize = 2.5
gif_frequency = 10  # Increase this value to save the GIF saving time
from deepinv.sampling import (
    PosteriorDiffusion,
    DPSDataFidelity,
    EulerSolver,
    VarianceExplodingDiffusion,
)
from deepinv.optim import ZeroFidelity

# In this example, we use the pre-trained FFHQ-64 model from the
# EDM framework: https://arxiv.org/pdf/2206.00364 .
# The network architecture is from Song et al: https://arxiv.org/abs/2011.13456 .
denoiser = NCSNpp(pretrained="download").to(device)

# The solution is obtained by calling the SDE object with a desired solver (here, Euler).
# The reproducibility of the SDE Solver class can be controlled by providing the pseudo-random number generator.
num_steps = 150
rng = torch.Generator(device).manual_seed(42)
timesteps = torch.linspace(1, 0.001, num_steps)
solver = EulerSolver(timesteps=timesteps, rng=rng)


sigma_min = 0.005
sigma_max = 5
sde = VarianceExplodingDiffusion(
    sigma_max=sigma_max,
    sigma_min=sigma_min,
    alpha=0.5,
    device=device,
    dtype=dtype,
)
Downloading: "https://huggingface.co/deepinv/edm/resolve/main/ncsnpp-ffhq64-uncond-ve.pt?download=true" to /home/runner/.cache/torch/hub/checkpoints/ncsnpp-ffhq64-uncond-ve.pt

  0%|          | 0.00/240M [00:00<?, ?B/s]
 11%|█         | 25.5M/240M [00:00<00:00, 267MB/s]
 22%|██▏       | 53.9M/240M [00:00<00:00, 285MB/s]
 35%|███▌      | 84.8M/240M [00:00<00:00, 303MB/s]
 48%|████▊     | 114M/240M [00:00<00:00, 306MB/s]
 61%|██████    | 145M/240M [00:00<00:00, 310MB/s]
 74%|███████▎  | 176M/240M [00:00<00:00, 316MB/s]
 87%|████████▋ | 208M/240M [00:00<00:00, 321MB/s]
100%|█████████▉| 239M/240M [00:00<00:00, 323MB/s]
100%|██████████| 240M/240M [00:00<00:00, 313MB/s]

Reverse-time SDE as sampling process#

When the data fidelity is not given, the posterior diffusion is equivalent to the unconditional diffusion. Sampling is performed by solving the reverse-time SDE. To do so, we generate a reverse-time trajectory.

model = PosteriorDiffusion(
    data_fidelity=ZeroFidelity(),
    sde=sde,
    denoiser=denoiser,
    solver=solver,
    dtype=dtype,
    device=device,
    verbose=True,
)
x, trajectory = model(
    y=None,
    physics=None,
    x_init=(1, 3, 64, 64),
    seed=1,
    get_trajectory=True,
)
dinv.utils.plot(
    x,
    titles="Unconditional generation",
    save_fn="sde_sample.png",
    figsize=(figsize, figsize),
)

dinv.utils.save_videos(
    trajectory.cpu()[::gif_frequency],
    time_dim=0,
    titles=["VE-SDE Trajectory"],
    save_fn="sde_trajectory.gif",
    figsize=(figsize, figsize),
)
  0%|          | 0/149 [00:00<?, ?it/s]
  1%|          | 1/149 [00:00<01:29,  1.65it/s]
  1%|▏         | 2/149 [00:01<01:23,  1.77it/s]
  2%|▏         | 3/149 [00:01<01:21,  1.80it/s]
  3%|▎         | 4/149 [00:02<01:19,  1.82it/s]
  3%|▎         | 5/149 [00:02<01:18,  1.83it/s]
  4%|▍         | 6/149 [00:03<01:18,  1.83it/s]
  5%|▍         | 7/149 [00:03<01:17,  1.84it/s]
  5%|▌         | 8/149 [00:04<01:16,  1.84it/s]
  6%|▌         | 9/149 [00:04<01:15,  1.84it/s]
  7%|▋         | 10/149 [00:05<01:15,  1.84it/s]
  7%|▋         | 11/149 [00:06<01:14,  1.85it/s]
  8%|▊         | 12/149 [00:06<01:14,  1.84it/s]
  9%|▊         | 13/149 [00:07<01:13,  1.85it/s]
  9%|▉         | 14/149 [00:07<01:13,  1.83it/s]
 10%|█         | 15/149 [00:08<01:12,  1.84it/s]
 11%|█         | 16/149 [00:08<01:12,  1.83it/s]
 11%|█▏        | 17/149 [00:09<01:11,  1.84it/s]
 12%|█▏        | 18/149 [00:09<01:11,  1.83it/s]
 13%|█▎        | 19/149 [00:10<01:10,  1.84it/s]
 13%|█▎        | 20/149 [00:10<01:10,  1.83it/s]
 14%|█▍        | 21/149 [00:11<01:09,  1.84it/s]
 15%|█▍        | 22/149 [00:12<01:09,  1.83it/s]
 15%|█▌        | 23/149 [00:12<01:08,  1.84it/s]
 16%|█▌        | 24/149 [00:13<01:08,  1.83it/s]
 17%|█▋        | 25/149 [00:13<01:07,  1.84it/s]
 17%|█▋        | 26/149 [00:14<01:07,  1.83it/s]
 18%|█▊        | 27/149 [00:14<01:06,  1.84it/s]
 19%|█▉        | 28/149 [00:15<01:06,  1.83it/s]
 19%|█▉        | 29/149 [00:15<01:05,  1.84it/s]
 20%|██        | 30/149 [00:16<01:05,  1.83it/s]
 21%|██        | 31/149 [00:16<01:04,  1.84it/s]
 21%|██▏       | 32/149 [00:17<01:03,  1.83it/s]
 22%|██▏       | 33/149 [00:18<01:03,  1.84it/s]
 23%|██▎       | 34/149 [00:18<01:02,  1.83it/s]
 23%|██▎       | 35/149 [00:19<01:01,  1.84it/s]
 24%|██▍       | 36/149 [00:19<01:01,  1.83it/s]
 25%|██▍       | 37/149 [00:20<01:00,  1.84it/s]
 26%|██▌       | 38/149 [00:20<01:01,  1.81it/s]
 26%|██▌       | 39/149 [00:21<01:00,  1.82it/s]
 27%|██▋       | 40/149 [00:21<01:00,  1.81it/s]
 28%|██▊       | 41/149 [00:22<00:59,  1.83it/s]
 28%|██▊       | 42/149 [00:22<00:58,  1.81it/s]
 29%|██▉       | 43/149 [00:23<00:57,  1.83it/s]
 30%|██▉       | 44/149 [00:24<00:57,  1.82it/s]
 30%|███       | 45/149 [00:24<00:56,  1.83it/s]
 31%|███       | 46/149 [00:25<00:56,  1.82it/s]
 32%|███▏      | 47/149 [00:25<00:55,  1.83it/s]
 32%|███▏      | 48/149 [00:26<00:55,  1.82it/s]
 33%|███▎      | 49/149 [00:26<00:54,  1.83it/s]
 34%|███▎      | 50/149 [00:27<00:54,  1.82it/s]
 34%|███▍      | 51/149 [00:27<00:53,  1.83it/s]
 35%|███▍      | 52/149 [00:28<00:53,  1.82it/s]
 36%|███▌      | 53/149 [00:28<00:52,  1.82it/s]
 36%|███▌      | 54/149 [00:29<00:53,  1.79it/s]
 37%|███▋      | 55/149 [00:30<00:52,  1.81it/s]
 38%|███▊      | 56/149 [00:30<00:51,  1.81it/s]
 38%|███▊      | 57/149 [00:31<00:50,  1.82it/s]
 39%|███▉      | 58/149 [00:31<00:49,  1.82it/s]
 40%|███▉      | 59/149 [00:32<00:49,  1.82it/s]
 40%|████      | 60/149 [00:32<00:48,  1.82it/s]
 41%|████      | 61/149 [00:33<00:48,  1.83it/s]
 42%|████▏     | 62/149 [00:33<00:47,  1.83it/s]
 42%|████▏     | 63/149 [00:34<00:46,  1.83it/s]
 43%|████▎     | 64/149 [00:35<00:46,  1.82it/s]
 44%|████▎     | 65/149 [00:35<00:45,  1.83it/s]
 44%|████▍     | 66/149 [00:36<00:45,  1.83it/s]
 45%|████▍     | 67/149 [00:36<00:44,  1.83it/s]
 46%|████▌     | 68/149 [00:37<00:44,  1.83it/s]
 46%|████▋     | 69/149 [00:37<00:43,  1.84it/s]
 47%|████▋     | 70/149 [00:38<00:43,  1.83it/s]
 48%|████▊     | 71/149 [00:38<00:42,  1.84it/s]
 48%|████▊     | 72/149 [00:39<00:41,  1.83it/s]
 49%|████▉     | 73/149 [00:39<00:41,  1.84it/s]
 50%|████▉     | 74/149 [00:40<00:40,  1.83it/s]
 50%|█████     | 75/149 [00:41<00:40,  1.84it/s]
 51%|█████     | 76/149 [00:41<00:39,  1.84it/s]
 52%|█████▏    | 77/149 [00:42<00:39,  1.84it/s]
 52%|█████▏    | 78/149 [00:42<00:38,  1.84it/s]
 53%|█████▎    | 79/149 [00:43<00:38,  1.83it/s]
 54%|█████▎    | 80/149 [00:43<00:37,  1.83it/s]
 54%|█████▍    | 81/149 [00:44<00:37,  1.84it/s]
 55%|█████▌    | 82/149 [00:44<00:36,  1.83it/s]
 56%|█████▌    | 83/149 [00:45<00:35,  1.84it/s]
 56%|█████▋    | 84/149 [00:45<00:35,  1.84it/s]
 57%|█████▋    | 85/149 [00:46<00:34,  1.84it/s]
 58%|█████▊    | 86/149 [00:47<00:34,  1.85it/s]
 58%|█████▊    | 87/149 [00:47<00:33,  1.84it/s]
 59%|█████▉    | 88/149 [00:48<00:33,  1.84it/s]
 60%|█████▉    | 89/149 [00:48<00:32,  1.83it/s]
 60%|██████    | 90/149 [00:49<00:32,  1.83it/s]
 61%|██████    | 91/149 [00:49<00:31,  1.82it/s]
 62%|██████▏   | 92/149 [00:50<00:31,  1.82it/s]
 62%|██████▏   | 93/149 [00:50<00:30,  1.82it/s]
 63%|██████▎   | 94/149 [00:51<00:29,  1.83it/s]
 64%|██████▍   | 95/149 [00:51<00:29,  1.83it/s]
 64%|██████▍   | 96/149 [00:52<00:28,  1.84it/s]
 65%|██████▌   | 97/149 [00:53<00:28,  1.83it/s]
 66%|██████▌   | 98/149 [00:53<00:27,  1.84it/s]
 66%|██████▋   | 99/149 [00:54<00:27,  1.83it/s]
 67%|██████▋   | 100/149 [00:54<00:26,  1.84it/s]
 68%|██████▊   | 101/149 [00:55<00:26,  1.83it/s]
 68%|██████▊   | 102/149 [00:55<00:25,  1.84it/s]
 69%|██████▉   | 103/149 [00:56<00:25,  1.83it/s]
 70%|██████▉   | 104/149 [00:56<00:24,  1.84it/s]
 70%|███████   | 105/149 [00:57<00:24,  1.82it/s]
 71%|███████   | 106/149 [00:57<00:23,  1.83it/s]
 72%|███████▏  | 107/149 [00:58<00:22,  1.83it/s]
 72%|███████▏  | 108/149 [00:59<00:22,  1.84it/s]
 73%|███████▎  | 109/149 [00:59<00:21,  1.83it/s]
 74%|███████▍  | 110/149 [01:00<00:21,  1.83it/s]
 74%|███████▍  | 111/149 [01:00<00:20,  1.82it/s]
 75%|███████▌  | 112/149 [01:01<00:20,  1.83it/s]
 76%|███████▌  | 113/149 [01:01<00:19,  1.82it/s]
 77%|███████▋  | 114/149 [01:02<00:19,  1.83it/s]
 77%|███████▋  | 115/149 [01:02<00:18,  1.82it/s]
 78%|███████▊  | 116/149 [01:03<00:18,  1.83it/s]
 79%|███████▊  | 117/149 [01:03<00:17,  1.82it/s]
 79%|███████▉  | 118/149 [01:04<00:16,  1.83it/s]
 80%|███████▉  | 119/149 [01:05<00:16,  1.83it/s]
 81%|████████  | 120/149 [01:05<00:15,  1.83it/s]
 81%|████████  | 121/149 [01:06<00:15,  1.82it/s]
 82%|████████▏ | 122/149 [01:06<00:14,  1.84it/s]
 83%|████████▎ | 123/149 [01:07<00:14,  1.82it/s]
 83%|████████▎ | 124/149 [01:07<00:13,  1.84it/s]
 84%|████████▍ | 125/149 [01:08<00:13,  1.82it/s]
 85%|████████▍ | 126/149 [01:08<00:12,  1.83it/s]
 85%|████████▌ | 127/149 [01:09<00:12,  1.81it/s]
 86%|████████▌ | 128/149 [01:09<00:11,  1.82it/s]
 87%|████████▋ | 129/149 [01:10<00:11,  1.81it/s]
 87%|████████▋ | 130/149 [01:11<00:10,  1.81it/s]
 88%|████████▊ | 131/149 [01:11<00:09,  1.81it/s]
 89%|████████▊ | 132/149 [01:12<00:09,  1.82it/s]
 89%|████████▉ | 133/149 [01:12<00:08,  1.82it/s]
 90%|████████▉ | 134/149 [01:13<00:08,  1.83it/s]
 91%|█████████ | 135/149 [01:13<00:07,  1.82it/s]
 91%|█████████▏| 136/149 [01:14<00:07,  1.83it/s]
 92%|█████████▏| 137/149 [01:14<00:06,  1.83it/s]
 93%|█████████▎| 138/149 [01:15<00:05,  1.84it/s]
 93%|█████████▎| 139/149 [01:16<00:05,  1.83it/s]
 94%|█████████▍| 140/149 [01:16<00:04,  1.84it/s]
 95%|█████████▍| 141/149 [01:17<00:04,  1.83it/s]
 95%|█████████▌| 142/149 [01:17<00:03,  1.84it/s]
 96%|█████████▌| 143/149 [01:18<00:03,  1.83it/s]
 97%|█████████▋| 144/149 [01:18<00:02,  1.84it/s]
 97%|█████████▋| 145/149 [01:19<00:02,  1.84it/s]
 98%|█████████▊| 146/149 [01:19<00:01,  1.84it/s]
 99%|█████████▊| 147/149 [01:20<00:01,  1.84it/s]
 99%|█████████▉| 148/149 [01:20<00:00,  1.84it/s]
100%|██████████| 149/149 [01:21<00:00,  1.84it/s]
100%|██████████| 149/149 [01:21<00:00,  1.83it/s]

We obtain the following unconditional sample

example of unconditional sampleexample of unconditional trajectory

When the data fidelity is given, together with the measurements and the physics, this class can be used to perform posterior sampling for inverse problems. For example, consider the inpainting problem, where we have a noisy image and we want to recover the original image. We can use the deepinv.sampling.DPSDataFidelity as the data fidelity term.

del trajectory  # clean memory
mask = torch.ones_like(x)
mask[..., 24:40, 24:40] = 0.0
physics = dinv.physics.Inpainting(tensor_size=x.shape[1:], mask=mask, device=device)
y = physics(x)

weight = 1.0  # guidance strength
dps_fidelity = DPSDataFidelity(denoiser=denoiser, weight=weight)

model = PosteriorDiffusion(
    data_fidelity=dps_fidelity,
    denoiser=denoiser,
    sde=sde,
    solver=solver,
    dtype=dtype,
    device=device,
    verbose=True,
)

# To perform posterior sampling, we need to provide the measurements, the physics and the solver.
# Moreover, when the physics is given, the initial point can be inferred from the physics if not given explicitly.
seed_1 = 11
x_hat, trajectory = model(
    y,
    physics,
    seed=seed_1,
    get_trajectory=True,
)
# Here, we plot the original image, the measurement and the posterior sample
dinv.utils.plot(
    [x, y, x_hat],
    show=True,
    titles=["Original", "Measurement", "Posterior sample"],
    save_fn="posterior_sample.png",
    figsize=(figsize * 3, figsize),
)
# We can also save the trajectory of the posterior sample
dinv.utils.save_videos(
    trajectory[::gif_frequency],
    time_dim=0,
    titles=["Posterior sample with VE"],
    save_fn="posterior_trajectory.gif",
    figsize=(figsize, figsize),
)
  0%|          | 0/149 [00:00<?, ?it/s]
  1%|          | 1/149 [00:01<04:05,  1.66s/it]
  1%|▏         | 2/149 [00:03<04:00,  1.64s/it]
  2%|▏         | 3/149 [00:04<03:59,  1.64s/it]
  3%|▎         | 4/149 [00:06<03:56,  1.63s/it]
  3%|▎         | 5/149 [00:08<03:55,  1.63s/it]
  4%|▍         | 6/149 [00:09<03:52,  1.63s/it]
  5%|▍         | 7/149 [00:11<03:51,  1.63s/it]
  5%|▌         | 8/149 [00:13<03:49,  1.63s/it]
  6%|▌         | 9/149 [00:14<03:47,  1.62s/it]
  7%|▋         | 10/149 [00:16<03:45,  1.62s/it]
  7%|▋         | 11/149 [00:17<03:43,  1.62s/it]
  8%|▊         | 12/149 [00:19<03:41,  1.62s/it]
  9%|▊         | 13/149 [00:21<03:39,  1.62s/it]
  9%|▉         | 14/149 [00:22<03:38,  1.62s/it]
 10%|█         | 15/149 [00:24<03:36,  1.62s/it]
 11%|█         | 16/149 [00:26<03:35,  1.62s/it]
 11%|█▏        | 17/149 [00:27<03:33,  1.62s/it]
 12%|█▏        | 18/149 [00:29<03:32,  1.62s/it]
 13%|█▎        | 19/149 [00:30<03:30,  1.62s/it]
 13%|█▎        | 20/149 [00:32<03:29,  1.62s/it]
 14%|█▍        | 21/149 [00:34<03:27,  1.62s/it]
 15%|█▍        | 22/149 [00:35<03:25,  1.62s/it]
 15%|█▌        | 23/149 [00:37<03:23,  1.62s/it]
 16%|█▌        | 24/149 [00:38<03:21,  1.61s/it]
 17%|█▋        | 25/149 [00:40<03:20,  1.62s/it]
 17%|█▋        | 26/149 [00:42<03:18,  1.61s/it]
 18%|█▊        | 27/149 [00:43<03:17,  1.62s/it]
 19%|█▉        | 28/149 [00:45<03:15,  1.62s/it]
 19%|█▉        | 29/149 [00:47<03:14,  1.62s/it]
 20%|██        | 30/149 [00:48<03:13,  1.62s/it]
 21%|██        | 31/149 [00:50<03:11,  1.63s/it]
 21%|██▏       | 32/149 [00:51<03:09,  1.62s/it]
 22%|██▏       | 33/149 [00:53<03:08,  1.63s/it]
 23%|██▎       | 34/149 [00:55<03:06,  1.62s/it]
 23%|██▎       | 35/149 [00:56<03:05,  1.62s/it]
 24%|██▍       | 36/149 [00:58<03:02,  1.62s/it]
 25%|██▍       | 37/149 [01:00<03:01,  1.62s/it]
 26%|██▌       | 38/149 [01:01<02:59,  1.62s/it]
 26%|██▌       | 39/149 [01:03<02:58,  1.62s/it]
 27%|██▋       | 40/149 [01:04<02:57,  1.63s/it]
 28%|██▊       | 41/149 [01:06<02:55,  1.63s/it]
 28%|██▊       | 42/149 [01:08<02:54,  1.63s/it]
 29%|██▉       | 43/149 [01:09<02:52,  1.63s/it]
 30%|██▉       | 44/149 [01:11<02:51,  1.63s/it]
 30%|███       | 45/149 [01:13<02:49,  1.63s/it]
 31%|███       | 46/149 [01:14<02:48,  1.63s/it]
 32%|███▏      | 47/149 [01:16<02:46,  1.63s/it]
 32%|███▏      | 48/149 [01:17<02:44,  1.63s/it]
 33%|███▎      | 49/149 [01:19<02:42,  1.63s/it]
 34%|███▎      | 50/149 [01:21<02:42,  1.64s/it]
 34%|███▍      | 51/149 [01:22<02:39,  1.63s/it]
 35%|███▍      | 52/149 [01:24<02:38,  1.63s/it]
 36%|███▌      | 53/149 [01:26<02:36,  1.63s/it]
 36%|███▌      | 54/149 [01:27<02:34,  1.63s/it]
 37%|███▋      | 55/149 [01:29<02:32,  1.62s/it]
 38%|███▊      | 56/149 [01:30<02:30,  1.62s/it]
 38%|███▊      | 57/149 [01:32<02:28,  1.62s/it]
 39%|███▉      | 58/149 [01:34<02:27,  1.62s/it]
 40%|███▉      | 59/149 [01:35<02:25,  1.62s/it]
 40%|████      | 60/149 [01:37<02:24,  1.62s/it]
 41%|████      | 61/149 [01:39<02:23,  1.63s/it]
 42%|████▏     | 62/149 [01:40<02:21,  1.63s/it]
 42%|████▏     | 63/149 [01:42<02:20,  1.63s/it]
 43%|████▎     | 64/149 [01:43<02:18,  1.63s/it]
 44%|████▎     | 65/149 [01:45<02:17,  1.64s/it]
 44%|████▍     | 66/149 [01:47<02:15,  1.64s/it]
 45%|████▍     | 67/149 [01:48<02:14,  1.64s/it]
 46%|████▌     | 68/149 [01:50<02:14,  1.66s/it]
 46%|████▋     | 69/149 [01:52<02:12,  1.65s/it]
 47%|████▋     | 70/149 [01:53<02:10,  1.65s/it]
 48%|████▊     | 71/149 [01:55<02:08,  1.65s/it]
 48%|████▊     | 72/149 [01:57<02:06,  1.65s/it]
 49%|████▉     | 73/149 [01:58<02:04,  1.64s/it]
 50%|████▉     | 74/149 [02:00<02:03,  1.64s/it]
 50%|█████     | 75/149 [02:02<02:01,  1.64s/it]
 51%|█████     | 76/149 [02:03<01:59,  1.63s/it]
 52%|█████▏    | 77/149 [02:05<01:57,  1.64s/it]
 52%|█████▏    | 78/149 [02:06<01:55,  1.63s/it]
 53%|█████▎    | 79/149 [02:08<01:54,  1.63s/it]
 54%|█████▎    | 80/149 [02:10<01:52,  1.63s/it]
 54%|█████▍    | 81/149 [02:11<01:51,  1.63s/it]
 55%|█████▌    | 82/149 [02:13<01:49,  1.63s/it]
 56%|█████▌    | 83/149 [02:15<01:47,  1.62s/it]
 56%|█████▋    | 84/149 [02:16<01:45,  1.62s/it]
 57%|█████▋    | 85/149 [02:18<01:43,  1.62s/it]
 58%|█████▊    | 86/149 [02:19<01:42,  1.62s/it]
 58%|█████▊    | 87/149 [02:21<01:40,  1.62s/it]
 59%|█████▉    | 88/149 [02:23<01:39,  1.62s/it]
 60%|█████▉    | 89/149 [02:24<01:37,  1.62s/it]
 60%|██████    | 90/149 [02:26<01:35,  1.63s/it]
 61%|██████    | 91/149 [02:28<01:34,  1.62s/it]
 62%|██████▏   | 92/149 [02:29<01:32,  1.63s/it]
 62%|██████▏   | 93/149 [02:31<01:30,  1.62s/it]
 63%|██████▎   | 94/149 [02:32<01:29,  1.63s/it]
 64%|██████▍   | 95/149 [02:34<01:27,  1.62s/it]
 64%|██████▍   | 96/149 [02:36<01:26,  1.62s/it]
 65%|██████▌   | 97/149 [02:37<01:24,  1.62s/it]
 66%|██████▌   | 98/149 [02:39<01:22,  1.62s/it]
 66%|██████▋   | 99/149 [02:41<01:20,  1.62s/it]
 67%|██████▋   | 100/149 [02:42<01:19,  1.62s/it]
 68%|██████▊   | 101/149 [02:44<01:17,  1.62s/it]
 68%|██████▊   | 102/149 [02:45<01:16,  1.62s/it]
 69%|██████▉   | 103/149 [02:47<01:14,  1.62s/it]
 70%|██████▉   | 104/149 [02:49<01:13,  1.62s/it]
 70%|███████   | 105/149 [02:50<01:11,  1.63s/it]
 71%|███████   | 106/149 [02:52<01:09,  1.63s/it]
 72%|███████▏  | 107/149 [02:54<01:08,  1.63s/it]
 72%|███████▏  | 108/149 [02:55<01:06,  1.62s/it]
 73%|███████▎  | 109/149 [02:57<01:05,  1.63s/it]
 74%|███████▍  | 110/149 [02:58<01:03,  1.62s/it]
 74%|███████▍  | 111/149 [03:00<01:01,  1.63s/it]
 75%|███████▌  | 112/149 [03:02<01:00,  1.62s/it]
 76%|███████▌  | 113/149 [03:03<00:59,  1.65s/it]
 77%|███████▋  | 114/149 [03:05<00:57,  1.64s/it]
 77%|███████▋  | 115/149 [03:07<00:55,  1.64s/it]
 78%|███████▊  | 116/149 [03:08<00:53,  1.63s/it]
 79%|███████▊  | 117/149 [03:10<00:52,  1.63s/it]
 79%|███████▉  | 118/149 [03:11<00:50,  1.63s/it]
 80%|███████▉  | 119/149 [03:13<00:48,  1.63s/it]
 81%|████████  | 120/149 [03:15<00:47,  1.62s/it]
 81%|████████  | 121/149 [03:16<00:45,  1.62s/it]
 82%|████████▏ | 122/149 [03:18<00:43,  1.62s/it]
 83%|████████▎ | 123/149 [03:20<00:42,  1.62s/it]
 83%|████████▎ | 124/149 [03:21<00:40,  1.62s/it]
 84%|████████▍ | 125/149 [03:23<00:38,  1.62s/it]
 85%|████████▍ | 126/149 [03:24<00:37,  1.63s/it]
 85%|████████▌ | 127/149 [03:26<00:35,  1.63s/it]
 86%|████████▌ | 128/149 [03:28<00:34,  1.63s/it]
 87%|████████▋ | 129/149 [03:29<00:32,  1.63s/it]
 87%|████████▋ | 130/149 [03:31<00:30,  1.63s/it]
 88%|████████▊ | 131/149 [03:33<00:29,  1.62s/it]
 89%|████████▊ | 132/149 [03:34<00:27,  1.63s/it]
 89%|████████▉ | 133/149 [03:36<00:25,  1.62s/it]
 90%|████████▉ | 134/149 [03:37<00:24,  1.63s/it]
 91%|█████████ | 135/149 [03:39<00:22,  1.63s/it]
 91%|█████████▏| 136/149 [03:41<00:21,  1.63s/it]
 92%|█████████▏| 137/149 [03:42<00:19,  1.62s/it]
 93%|█████████▎| 138/149 [03:44<00:17,  1.62s/it]
 93%|█████████▎| 139/149 [03:46<00:16,  1.63s/it]
 94%|█████████▍| 140/149 [03:47<00:14,  1.63s/it]
 95%|█████████▍| 141/149 [03:49<00:13,  1.63s/it]
 95%|█████████▌| 142/149 [03:50<00:11,  1.63s/it]
 96%|█████████▌| 143/149 [03:52<00:09,  1.63s/it]
 97%|█████████▋| 144/149 [03:54<00:08,  1.62s/it]
 97%|█████████▋| 145/149 [03:55<00:06,  1.63s/it]
 98%|█████████▊| 146/149 [03:57<00:04,  1.62s/it]
 99%|█████████▊| 147/149 [03:59<00:03,  1.63s/it]
 99%|█████████▉| 148/149 [04:00<00:01,  1.62s/it]
100%|██████████| 149/149 [04:02<00:00,  1.63s/it]
100%|██████████| 149/149 [04:02<00:00,  1.63s/it]

We obtain the following posterior sample and trajectory

example of posterior sampleexample of posterior trajectory

Note

Reproducibility: To ensure the reproducibility, if the parameter rng is given, the same sample will be generated when the same seed is used. One can obtain varying samples by using a different seed.

Parallel sampling: one can draw multiple samples in parallel by giving the initial shape, e.g., x_init = (B, C, H, W)

Varying the SDE#

One can also change the underlying SDE for sampling. For example, we can also use the Variance-Preserving (VP or DDPM) in deepinv.sampling.VariancePreservingDiffusion, whose forward drift and diffusion term are defined as:

\[f(x_t, t) = -\frac{1}{2} \beta(t)x_t \qquad \mbox{ and } \qquad g(t) = \beta(t) \qquad \mbox{ with } \beta(t) = \beta_{\mathrm{min}} + t \left( \beta_{\mathrm{max}} - \beta_{\mathrm{min}} \right).\]
from deepinv.sampling import VariancePreservingDiffusion

del trajectory
sde = VariancePreservingDiffusion(device=device, dtype=dtype)
model = PosteriorDiffusion(
    data_fidelity=dps_fidelity,
    denoiser=denoiser,
    sde=sde,
    solver=solver,
    device=device,
    dtype=dtype,
    verbose=True,
)

x_hat_vp, trajectory = model(
    y,
    physics,
    seed=111,
    timesteps=torch.linspace(1, 0.001, 150),
    get_trajectory=True,
)
dinv.utils.plot(
    [x_hat, x_hat_vp],
    titles=[
        "posterior sample with VE",
        "posterior sample with VP",
    ],
    save_fn="posterior_sample_ve_vp.png",
    figsize=(figsize * 3, figsize),
)


# We can also save the trajectory of the posterior sample
dinv.utils.save_videos(
    trajectory[::gif_frequency],
    time_dim=0,
    titles=["Posterior sample with VP"],
    save_fn="posterior_trajectory_vp.gif",
    figsize=(figsize, figsize),
)
  0%|          | 0/149 [00:00<?, ?it/s]
  1%|          | 1/149 [00:01<04:00,  1.63s/it]
  1%|▏         | 2/149 [00:03<04:01,  1.64s/it]
  2%|▏         | 3/149 [00:04<03:59,  1.64s/it]
  3%|▎         | 4/149 [00:06<03:58,  1.64s/it]
  3%|▎         | 5/149 [00:08<03:55,  1.64s/it]
  4%|▍         | 6/149 [00:09<03:54,  1.64s/it]
  5%|▍         | 7/149 [00:11<03:51,  1.63s/it]
  5%|▌         | 8/149 [00:13<03:49,  1.63s/it]
  6%|▌         | 9/149 [00:14<03:47,  1.63s/it]
  7%|▋         | 10/149 [00:16<03:46,  1.63s/it]
  7%|▋         | 11/149 [00:17<03:44,  1.63s/it]
  8%|▊         | 12/149 [00:19<03:43,  1.63s/it]
  9%|▊         | 13/149 [00:21<03:41,  1.63s/it]
  9%|▉         | 14/149 [00:22<03:40,  1.63s/it]
 10%|█         | 15/149 [00:24<03:37,  1.63s/it]
 11%|█         | 16/149 [00:26<03:36,  1.63s/it]
 11%|█▏        | 17/149 [00:27<03:34,  1.62s/it]
 12%|█▏        | 18/149 [00:29<03:32,  1.62s/it]
 13%|█▎        | 19/149 [00:30<03:30,  1.62s/it]
 13%|█▎        | 20/149 [00:32<03:28,  1.62s/it]
 14%|█▍        | 21/149 [00:34<03:27,  1.62s/it]
 15%|█▍        | 22/149 [00:35<03:26,  1.62s/it]
 15%|█▌        | 23/149 [00:37<03:24,  1.63s/it]
 16%|█▌        | 24/149 [00:39<03:23,  1.62s/it]
 17%|█▋        | 25/149 [00:40<03:21,  1.63s/it]
 17%|█▋        | 26/149 [00:42<03:19,  1.62s/it]
 18%|█▊        | 27/149 [00:43<03:19,  1.63s/it]
 19%|█▉        | 28/149 [00:45<03:17,  1.63s/it]
 19%|█▉        | 29/149 [00:47<03:16,  1.63s/it]
 20%|██        | 30/149 [00:48<03:14,  1.63s/it]
 21%|██        | 31/149 [00:50<03:13,  1.64s/it]
 21%|██▏       | 32/149 [00:52<03:11,  1.63s/it]
 22%|██▏       | 33/149 [00:53<03:09,  1.63s/it]
 23%|██▎       | 34/149 [00:55<03:07,  1.63s/it]
 23%|██▎       | 35/149 [00:57<03:06,  1.63s/it]
 24%|██▍       | 36/149 [00:58<03:04,  1.63s/it]
 25%|██▍       | 37/149 [01:00<03:03,  1.64s/it]
 26%|██▌       | 38/149 [01:01<03:01,  1.63s/it]
 26%|██▌       | 39/149 [01:03<02:59,  1.63s/it]
 27%|██▋       | 40/149 [01:05<02:57,  1.63s/it]
 28%|██▊       | 41/149 [01:06<02:56,  1.63s/it]
 28%|██▊       | 42/149 [01:08<02:54,  1.63s/it]
 29%|██▉       | 43/149 [01:10<02:52,  1.63s/it]
 30%|██▉       | 44/149 [01:11<02:50,  1.62s/it]
 30%|███       | 45/149 [01:13<02:49,  1.63s/it]
 31%|███       | 46/149 [01:14<02:47,  1.62s/it]
 32%|███▏      | 47/149 [01:16<02:46,  1.63s/it]
 32%|███▏      | 48/149 [01:18<02:44,  1.63s/it]
 33%|███▎      | 49/149 [01:19<02:42,  1.62s/it]
 34%|███▎      | 50/149 [01:21<02:40,  1.63s/it]
 34%|███▍      | 51/149 [01:23<02:39,  1.62s/it]
 35%|███▍      | 52/149 [01:24<02:37,  1.63s/it]
 36%|███▌      | 53/149 [01:26<02:35,  1.62s/it]
 36%|███▌      | 54/149 [01:27<02:35,  1.63s/it]
 37%|███▋      | 55/149 [01:29<02:33,  1.63s/it]
 38%|███▊      | 56/149 [01:31<02:31,  1.63s/it]
 38%|███▊      | 57/149 [01:32<02:29,  1.63s/it]
 39%|███▉      | 58/149 [01:34<02:28,  1.63s/it]
 40%|███▉      | 59/149 [01:36<02:26,  1.63s/it]
 40%|████      | 60/149 [01:37<02:25,  1.63s/it]
 41%|████      | 61/149 [01:39<02:23,  1.63s/it]
 42%|████▏     | 62/149 [01:41<02:22,  1.63s/it]
 42%|████▏     | 63/149 [01:42<02:20,  1.63s/it]
 43%|████▎     | 64/149 [01:44<02:18,  1.63s/it]
 44%|████▎     | 65/149 [01:45<02:16,  1.63s/it]
 44%|████▍     | 66/149 [01:47<02:15,  1.63s/it]
 45%|████▍     | 67/149 [01:49<02:13,  1.63s/it]
 46%|████▌     | 68/149 [01:50<02:12,  1.63s/it]
 46%|████▋     | 69/149 [01:52<02:10,  1.63s/it]
 47%|████▋     | 70/149 [01:54<02:08,  1.63s/it]
 48%|████▊     | 71/149 [01:55<02:06,  1.63s/it]
 48%|████▊     | 72/149 [01:57<02:05,  1.63s/it]
 49%|████▉     | 73/149 [01:58<02:03,  1.63s/it]
 50%|████▉     | 74/149 [02:00<02:02,  1.63s/it]
 50%|█████     | 75/149 [02:02<02:00,  1.63s/it]
 51%|█████     | 76/149 [02:03<01:58,  1.63s/it]
 52%|█████▏    | 77/149 [02:05<01:57,  1.63s/it]
 52%|█████▏    | 78/149 [02:07<01:55,  1.62s/it]
 53%|█████▎    | 79/149 [02:08<01:53,  1.63s/it]
 54%|█████▎    | 80/149 [02:10<01:51,  1.62s/it]
 54%|█████▍    | 81/149 [02:11<01:50,  1.62s/it]
 55%|█████▌    | 82/149 [02:13<01:48,  1.62s/it]
 56%|█████▌    | 83/149 [02:15<01:47,  1.63s/it]
 56%|█████▋    | 84/149 [02:16<01:45,  1.63s/it]
 57%|█████▋    | 85/149 [02:18<01:44,  1.63s/it]
 58%|█████▊    | 86/149 [02:20<01:42,  1.63s/it]
 58%|█████▊    | 87/149 [02:21<01:40,  1.63s/it]
 59%|█████▉    | 88/149 [02:23<01:39,  1.63s/it]
 60%|█████▉    | 89/149 [02:24<01:37,  1.63s/it]
 60%|██████    | 90/149 [02:26<01:36,  1.63s/it]
 61%|██████    | 91/149 [02:28<01:34,  1.63s/it]
 62%|██████▏   | 92/149 [02:29<01:33,  1.63s/it]
 62%|██████▏   | 93/149 [02:31<01:31,  1.64s/it]
 63%|██████▎   | 94/149 [02:33<01:30,  1.64s/it]
 64%|██████▍   | 95/149 [02:34<01:28,  1.64s/it]
 64%|██████▍   | 96/149 [02:36<01:26,  1.64s/it]
 65%|██████▌   | 97/149 [02:38<01:25,  1.64s/it]
 66%|██████▌   | 98/149 [02:39<01:23,  1.64s/it]
 66%|██████▋   | 99/149 [02:41<01:22,  1.64s/it]
 67%|██████▋   | 100/149 [02:42<01:20,  1.64s/it]
 68%|██████▊   | 101/149 [02:44<01:18,  1.64s/it]
 68%|██████▊   | 102/149 [02:46<01:16,  1.64s/it]
 69%|██████▉   | 103/149 [02:47<01:15,  1.64s/it]
 70%|██████▉   | 104/149 [02:49<01:13,  1.63s/it]
 70%|███████   | 105/149 [02:51<01:12,  1.64s/it]
 71%|███████   | 106/149 [02:52<01:10,  1.64s/it]
 72%|███████▏  | 107/149 [02:54<01:08,  1.64s/it]
 72%|███████▏  | 108/149 [02:56<01:07,  1.64s/it]
 73%|███████▎  | 109/149 [02:57<01:05,  1.64s/it]
 74%|███████▍  | 110/149 [02:59<01:03,  1.64s/it]
 74%|███████▍  | 111/149 [03:01<01:02,  1.64s/it]
 75%|███████▌  | 112/149 [03:02<01:00,  1.64s/it]
 76%|███████▌  | 113/149 [03:04<00:58,  1.64s/it]
 77%|███████▋  | 114/149 [03:05<00:57,  1.63s/it]
 77%|███████▋  | 115/149 [03:07<00:55,  1.63s/it]
 78%|███████▊  | 116/149 [03:09<00:53,  1.63s/it]
 79%|███████▊  | 117/149 [03:10<00:52,  1.63s/it]
 79%|███████▉  | 118/149 [03:12<00:50,  1.63s/it]
 80%|███████▉  | 119/149 [03:14<00:49,  1.64s/it]
 81%|████████  | 120/149 [03:15<00:47,  1.64s/it]
 81%|████████  | 121/149 [03:17<00:45,  1.64s/it]
 82%|████████▏ | 122/149 [03:18<00:44,  1.64s/it]
 83%|████████▎ | 123/149 [03:20<00:42,  1.63s/it]
 83%|████████▎ | 124/149 [03:22<00:40,  1.63s/it]
 84%|████████▍ | 125/149 [03:23<00:39,  1.64s/it]
 85%|████████▍ | 126/149 [03:25<00:37,  1.63s/it]
 85%|████████▌ | 127/149 [03:27<00:35,  1.63s/it]
 86%|████████▌ | 128/149 [03:28<00:34,  1.63s/it]
 87%|████████▋ | 129/149 [03:30<00:32,  1.63s/it]
 87%|████████▋ | 130/149 [03:32<00:31,  1.63s/it]
 88%|████████▊ | 131/149 [03:33<00:29,  1.63s/it]
 89%|████████▊ | 132/149 [03:35<00:27,  1.63s/it]
 89%|████████▉ | 133/149 [03:36<00:26,  1.63s/it]
 90%|████████▉ | 134/149 [03:38<00:24,  1.63s/it]
 91%|█████████ | 135/149 [03:40<00:22,  1.63s/it]
 91%|█████████▏| 136/149 [03:41<00:21,  1.64s/it]
 92%|█████████▏| 137/149 [03:43<00:19,  1.64s/it]
 93%|█████████▎| 138/149 [03:45<00:18,  1.64s/it]
 93%|█████████▎| 139/149 [03:46<00:16,  1.64s/it]
 94%|█████████▍| 140/149 [03:48<00:14,  1.64s/it]
 95%|█████████▍| 141/149 [03:50<00:13,  1.64s/it]
 95%|█████████▌| 142/149 [03:51<00:11,  1.66s/it]
 96%|█████████▌| 143/149 [03:53<00:09,  1.65s/it]
 97%|█████████▋| 144/149 [03:55<00:08,  1.65s/it]
 97%|█████████▋| 145/149 [03:56<00:06,  1.64s/it]
 98%|█████████▊| 146/149 [03:58<00:04,  1.65s/it]
 99%|█████████▊| 147/149 [03:59<00:03,  1.65s/it]
 99%|█████████▉| 148/149 [04:01<00:01,  1.65s/it]
100%|██████████| 149/149 [04:03<00:00,  1.65s/it]
100%|██████████| 149/149 [04:03<00:00,  1.63s/it]

We can comparing the sampling trajectory depending on the underlying SDE

posterior sample with VP
posterior trajectory with VEposterior trajectory with VP

Plug-and-play Posterior Sampling with arbitrary denoisers#

The deepinv.sampling.PosteriorDiffusion class can be used together with any (well-trained) denoisers for posterior sampling. For example, we can use the deepinv.models.DRUNet for posterior sampling. We can also change the underlying SDE, for example change the sigma_max value.

del trajectory  # clean memory
sigma_min = 0.001
sigma_max = 10.0
rng = torch.Generator(device)
dtype = torch.float32
timesteps = torch.linspace(1, 0.001, 250)
solver = EulerSolver(timesteps=timesteps, rng=rng)
denoiser = dinv.models.DRUNet(pretrained="download").to(device)

sde = VarianceExplodingDiffusion(
    sigma_max=sigma_max, sigma_min=sigma_min, alpha=0.75, device=device, dtype=dtype
)
x = dinv.utils.load_url_image(
    dinv.utils.demo.get_image_url("butterfly.png"),
    img_size=256,
    resize_mode="resize",
).to(device)

mask = torch.ones_like(x)
mask[..., 70:150, 120:180] = 0
physics = dinv.physics.Inpainting(
    mask=mask,
    tensor_size=x.shape[1:],
    device=device,
)

y = physics(x)
model = PosteriorDiffusion(
    data_fidelity=DPSDataFidelity(denoiser=denoiser, weight=0.3),
    denoiser=denoiser,
    sde=sde,
    solver=solver,
    dtype=dtype,
    device=device,
    verbose=True,
)

# To perform posterior sampling, we need to provide the measurements, the physics and the solver.
x_hat, trajectory = model(
    y=y,
    physics=physics,
    seed=12,
    get_trajectory=True,
)

# Here, we plot the original image, the measurement and the posterior sample
dinv.utils.plot(
    [x, y, x_hat.clip(0, 1)],
    titles=["Original", "Measurement", "Posterior sample DRUNet"],
    figsize=(figsize * 3, figsize),
    save_fn="posterior_sample_DRUNet.png",
)

# We can also save the trajectory of the posterior sample
dinv.utils.save_videos(
    trajectory[::gif_frequency].clip(0, 1),
    time_dim=0,
    titles=["Posterior trajectory DRUNet"],
    save_fn="posterior_sample_DRUNet.gif",
    figsize=(figsize, figsize),
)
  0%|          | 0/249 [00:00<?, ?it/s]
  0%|          | 1/249 [00:05<20:47,  5.03s/it]
  1%|          | 2/249 [00:10<20:35,  5.00s/it]
  1%|          | 3/249 [00:14<20:26,  4.99s/it]
  2%|▏         | 4/249 [00:19<20:20,  4.98s/it]
  2%|▏         | 5/249 [00:24<20:17,  4.99s/it]
  2%|▏         | 6/249 [00:29<20:12,  4.99s/it]
  3%|▎         | 7/249 [00:34<20:09,  5.00s/it]
  3%|▎         | 8/249 [00:39<20:03,  5.00s/it]
  4%|▎         | 9/249 [00:44<20:00,  5.00s/it]
  4%|▍         | 10/249 [00:49<19:55,  5.00s/it]
  4%|▍         | 11/249 [00:54<19:50,  5.00s/it]
  5%|▍         | 12/249 [00:59<19:43,  4.99s/it]
  5%|▌         | 13/249 [01:04<19:37,  4.99s/it]
  6%|▌         | 14/249 [01:09<19:32,  4.99s/it]
  6%|▌         | 15/249 [01:14<19:27,  4.99s/it]
  6%|▋         | 16/249 [01:19<19:21,  4.99s/it]
  7%|▋         | 17/249 [01:24<19:16,  4.99s/it]
  7%|▋         | 18/249 [01:29<19:11,  4.98s/it]
  8%|▊         | 19/249 [01:34<19:05,  4.98s/it]
  8%|▊         | 20/249 [01:39<18:59,  4.98s/it]
  8%|▊         | 21/249 [01:44<18:54,  4.98s/it]
  9%|▉         | 22/249 [01:49<18:48,  4.97s/it]
  9%|▉         | 23/249 [01:54<18:43,  4.97s/it]
 10%|▉         | 24/249 [01:59<18:38,  4.97s/it]
 10%|█         | 25/249 [02:04<18:33,  4.97s/it]
 10%|█         | 26/249 [02:09<18:27,  4.97s/it]
 11%|█         | 27/249 [02:14<18:22,  4.97s/it]
 11%|█         | 28/249 [02:19<18:17,  4.97s/it]
 12%|█▏        | 29/249 [02:24<18:12,  4.97s/it]
 12%|█▏        | 30/249 [02:29<18:08,  4.97s/it]
 12%|█▏        | 31/249 [02:34<18:03,  4.97s/it]
 13%|█▎        | 32/249 [02:39<17:58,  4.97s/it]
 13%|█▎        | 33/249 [02:44<17:55,  4.98s/it]
 14%|█▎        | 34/249 [02:49<17:49,  4.98s/it]
 14%|█▍        | 35/249 [02:54<17:44,  4.98s/it]
 14%|█▍        | 36/249 [02:59<17:39,  4.98s/it]
 15%|█▍        | 37/249 [03:04<17:34,  4.97s/it]
 15%|█▌        | 38/249 [03:09<17:29,  4.98s/it]
 16%|█▌        | 39/249 [03:14<17:24,  4.97s/it]
 16%|█▌        | 40/249 [03:19<17:19,  4.97s/it]
 16%|█▋        | 41/249 [03:24<17:13,  4.97s/it]
 17%|█▋        | 42/249 [03:29<17:07,  4.97s/it]
 17%|█▋        | 43/249 [03:34<17:03,  4.97s/it]
 18%|█▊        | 44/249 [03:39<17:00,  4.98s/it]
 18%|█▊        | 45/249 [03:44<16:54,  4.98s/it]
 18%|█▊        | 46/249 [03:49<16:49,  4.97s/it]
 19%|█▉        | 47/249 [03:54<16:44,  4.97s/it]
 19%|█▉        | 48/249 [03:58<16:39,  4.97s/it]
 20%|█▉        | 49/249 [04:03<16:33,  4.97s/it]
 20%|██        | 50/249 [04:08<16:28,  4.97s/it]
 20%|██        | 51/249 [04:13<16:23,  4.97s/it]
 21%|██        | 52/249 [04:18<16:17,  4.96s/it]
 21%|██▏       | 53/249 [04:23<16:13,  4.97s/it]
 22%|██▏       | 54/249 [04:28<16:07,  4.96s/it]
 22%|██▏       | 55/249 [04:33<16:02,  4.96s/it]
 22%|██▏       | 56/249 [04:38<16:01,  4.98s/it]
 23%|██▎       | 57/249 [04:43<15:55,  4.98s/it]
 23%|██▎       | 58/249 [04:48<15:50,  4.98s/it]
 24%|██▎       | 59/249 [04:53<15:44,  4.97s/it]
 24%|██▍       | 60/249 [04:58<15:39,  4.97s/it]
 24%|██▍       | 61/249 [05:03<15:34,  4.97s/it]
 25%|██▍       | 62/249 [05:08<15:28,  4.97s/it]
 25%|██▌       | 63/249 [05:13<15:23,  4.96s/it]
 26%|██▌       | 64/249 [05:18<15:17,  4.96s/it]
 26%|██▌       | 65/249 [05:23<15:13,  4.97s/it]
 27%|██▋       | 66/249 [05:28<15:09,  4.97s/it]
 27%|██▋       | 67/249 [05:33<15:04,  4.97s/it]
 27%|██▋       | 68/249 [05:38<14:58,  4.97s/it]
 28%|██▊       | 69/249 [05:43<14:53,  4.97s/it]
 28%|██▊       | 70/249 [05:48<14:50,  4.98s/it]
 29%|██▊       | 71/249 [05:53<14:45,  4.97s/it]
 29%|██▉       | 72/249 [05:58<14:40,  4.97s/it]
 29%|██▉       | 73/249 [06:03<14:35,  4.98s/it]
 30%|██▉       | 74/249 [06:08<14:31,  4.98s/it]
 30%|███       | 75/249 [06:13<14:25,  4.97s/it]
 31%|███       | 76/249 [06:18<14:20,  4.97s/it]
 31%|███       | 77/249 [06:23<14:15,  4.97s/it]
 31%|███▏      | 78/249 [06:28<14:10,  4.97s/it]
 32%|███▏      | 79/249 [06:33<14:05,  4.97s/it]
 32%|███▏      | 80/249 [06:38<13:59,  4.97s/it]
 33%|███▎      | 81/249 [06:42<13:54,  4.97s/it]
 33%|███▎      | 82/249 [06:47<13:50,  4.97s/it]
 33%|███▎      | 83/249 [06:52<13:45,  4.97s/it]
 34%|███▎      | 84/249 [06:57<13:39,  4.97s/it]
 34%|███▍      | 85/249 [07:02<13:35,  4.97s/it]
 35%|███▍      | 86/249 [07:07<13:32,  4.98s/it]
 35%|███▍      | 87/249 [07:12<13:26,  4.98s/it]
 35%|███▌      | 88/249 [07:17<13:21,  4.98s/it]
 36%|███▌      | 89/249 [07:22<13:17,  4.98s/it]
 36%|███▌      | 90/249 [07:27<13:12,  4.98s/it]
 37%|███▋      | 91/249 [07:32<13:08,  4.99s/it]
 37%|███▋      | 92/249 [07:37<13:03,  4.99s/it]
 37%|███▋      | 93/249 [07:42<12:58,  4.99s/it]
 38%|███▊      | 94/249 [07:47<12:53,  4.99s/it]
 38%|███▊      | 95/249 [07:52<12:47,  4.98s/it]
 39%|███▊      | 96/249 [07:57<12:42,  4.98s/it]
 39%|███▉      | 97/249 [08:02<12:38,  4.99s/it]
 39%|███▉      | 98/249 [08:07<12:32,  4.99s/it]
 40%|███▉      | 99/249 [08:12<12:27,  4.99s/it]
 40%|████      | 100/249 [08:18<12:41,  5.11s/it]
 41%|████      | 101/249 [08:23<12:30,  5.07s/it]
 41%|████      | 102/249 [08:28<12:21,  5.04s/it]
 41%|████▏     | 103/249 [08:33<12:13,  5.02s/it]
 42%|████▏     | 104/249 [08:38<12:06,  5.01s/it]
 42%|████▏     | 105/249 [08:43<11:59,  5.00s/it]
 43%|████▎     | 106/249 [08:48<11:54,  5.00s/it]
 43%|████▎     | 107/249 [08:52<11:48,  4.99s/it]
 43%|████▎     | 108/249 [08:57<11:43,  4.99s/it]
 44%|████▍     | 109/249 [09:02<11:37,  4.98s/it]
 44%|████▍     | 110/249 [09:07<11:32,  4.98s/it]
 45%|████▍     | 111/249 [09:12<11:26,  4.98s/it]
 45%|████▍     | 112/249 [09:17<11:21,  4.97s/it]
 45%|████▌     | 113/249 [09:22<11:16,  4.97s/it]
 46%|████▌     | 114/249 [09:27<11:11,  4.97s/it]
 46%|████▌     | 115/249 [09:32<11:06,  4.97s/it]
 47%|████▋     | 116/249 [09:37<11:03,  4.99s/it]
 47%|████▋     | 117/249 [09:42<10:57,  4.98s/it]
 47%|████▋     | 118/249 [09:47<10:52,  4.98s/it]
 48%|████▊     | 119/249 [09:52<10:47,  4.98s/it]
 48%|████▊     | 120/249 [09:57<10:43,  4.98s/it]
 49%|████▊     | 121/249 [10:02<10:37,  4.98s/it]
 49%|████▉     | 122/249 [10:07<10:32,  4.98s/it]
 49%|████▉     | 123/249 [10:12<10:27,  4.98s/it]
 50%|████▉     | 124/249 [10:17<10:22,  4.98s/it]
 50%|█████     | 125/249 [10:22<10:17,  4.98s/it]
 51%|█████     | 126/249 [10:27<10:13,  4.99s/it]
 51%|█████     | 127/249 [10:32<10:07,  4.98s/it]
 51%|█████▏    | 128/249 [10:37<10:02,  4.98s/it]
 52%|█████▏    | 129/249 [10:42<09:57,  4.98s/it]
 52%|█████▏    | 130/249 [10:47<09:53,  4.99s/it]
 53%|█████▎    | 131/249 [10:52<09:48,  4.98s/it]
 53%|█████▎    | 132/249 [10:57<09:43,  4.99s/it]
 53%|█████▎    | 133/249 [11:02<09:38,  4.98s/it]
 54%|█████▍    | 134/249 [11:07<09:32,  4.98s/it]
 54%|█████▍    | 135/249 [11:12<09:27,  4.98s/it]
 55%|█████▍    | 136/249 [11:17<09:22,  4.98s/it]
 55%|█████▌    | 137/249 [11:22<09:17,  4.98s/it]
 55%|█████▌    | 138/249 [11:27<09:12,  4.98s/it]
 56%|█████▌    | 139/249 [11:32<09:07,  4.98s/it]
 56%|█████▌    | 140/249 [11:37<09:02,  4.98s/it]
 57%|█████▋    | 141/249 [11:42<08:57,  4.97s/it]
 57%|█████▋    | 142/249 [11:47<08:53,  4.98s/it]
 57%|█████▋    | 143/249 [11:52<08:48,  4.99s/it]
 58%|█████▊    | 144/249 [11:57<08:43,  4.98s/it]
 58%|█████▊    | 145/249 [12:02<08:37,  4.98s/it]
 59%|█████▊    | 146/249 [12:07<08:32,  4.98s/it]
 59%|█████▉    | 147/249 [12:12<08:27,  4.98s/it]
 59%|█████▉    | 148/249 [12:17<08:22,  4.97s/it]
 60%|█████▉    | 149/249 [12:22<08:17,  4.98s/it]
 60%|██████    | 150/249 [12:27<08:12,  4.97s/it]
 61%|██████    | 151/249 [12:32<08:07,  4.97s/it]
 61%|██████    | 152/249 [12:37<08:02,  4.97s/it]
 61%|██████▏   | 153/249 [12:41<07:57,  4.97s/it]
 62%|██████▏   | 154/249 [12:46<07:52,  4.97s/it]
 62%|██████▏   | 155/249 [12:51<07:47,  4.97s/it]
 63%|██████▎   | 156/249 [12:56<07:42,  4.97s/it]
 63%|██████▎   | 157/249 [13:01<07:37,  4.97s/it]
 63%|██████▎   | 158/249 [13:06<07:32,  4.97s/it]
 64%|██████▍   | 159/249 [13:11<07:27,  4.97s/it]
 64%|██████▍   | 160/249 [13:16<07:22,  4.97s/it]
 65%|██████▍   | 161/249 [13:21<07:17,  4.97s/it]
 65%|██████▌   | 162/249 [13:26<07:12,  4.97s/it]
 65%|██████▌   | 163/249 [13:31<07:07,  4.97s/it]
 66%|██████▌   | 164/249 [13:36<07:02,  4.97s/it]
 66%|██████▋   | 165/249 [13:41<06:57,  4.97s/it]
 67%|██████▋   | 166/249 [13:46<06:52,  4.97s/it]
 67%|██████▋   | 167/249 [13:51<06:47,  4.97s/it]
 67%|██████▋   | 168/249 [13:56<06:42,  4.97s/it]
 68%|██████▊   | 169/249 [14:01<06:37,  4.97s/it]
 68%|██████▊   | 170/249 [14:06<06:32,  4.97s/it]
 69%|██████▊   | 171/249 [14:11<06:27,  4.97s/it]
 69%|██████▉   | 172/249 [14:16<06:22,  4.97s/it]
 69%|██████▉   | 173/249 [14:21<06:17,  4.97s/it]
 70%|██████▉   | 174/249 [14:26<06:12,  4.97s/it]
 70%|███████   | 175/249 [14:31<06:07,  4.97s/it]
 71%|███████   | 176/249 [14:36<06:02,  4.97s/it]
 71%|███████   | 177/249 [14:41<05:58,  4.98s/it]
 71%|███████▏  | 178/249 [14:46<05:53,  4.98s/it]
 72%|███████▏  | 179/249 [14:51<05:48,  4.98s/it]
 72%|███████▏  | 180/249 [14:56<05:43,  4.98s/it]
 73%|███████▎  | 181/249 [15:01<05:38,  4.97s/it]
 73%|███████▎  | 182/249 [15:06<05:33,  4.97s/it]
 73%|███████▎  | 183/249 [15:11<05:28,  4.97s/it]
 74%|███████▍  | 184/249 [15:16<05:22,  4.97s/it]
 74%|███████▍  | 185/249 [15:21<05:18,  4.97s/it]
 75%|███████▍  | 186/249 [15:26<05:13,  4.97s/it]
 75%|███████▌  | 187/249 [15:31<05:08,  4.98s/it]
 76%|███████▌  | 188/249 [15:36<05:03,  4.98s/it]
 76%|███████▌  | 189/249 [15:41<04:58,  4.98s/it]
 76%|███████▋  | 190/249 [15:46<04:54,  4.98s/it]
 77%|███████▋  | 191/249 [15:51<04:49,  4.98s/it]
 77%|███████▋  | 192/249 [15:55<04:43,  4.98s/it]
 78%|███████▊  | 193/249 [16:00<04:38,  4.97s/it]
 78%|███████▊  | 194/249 [16:05<04:33,  4.97s/it]
 78%|███████▊  | 195/249 [16:10<04:28,  4.97s/it]
 79%|███████▊  | 196/249 [16:15<04:23,  4.97s/it]
 79%|███████▉  | 197/249 [16:20<04:18,  4.97s/it]
 80%|███████▉  | 198/249 [16:25<04:13,  4.97s/it]
 80%|███████▉  | 199/249 [16:30<04:08,  4.97s/it]
 80%|████████  | 200/249 [16:35<04:03,  4.97s/it]
 81%|████████  | 201/249 [16:40<03:58,  4.97s/it]
 81%|████████  | 202/249 [16:45<03:53,  4.97s/it]
 82%|████████▏ | 203/249 [16:50<03:48,  4.97s/it]
 82%|████████▏ | 204/249 [16:55<03:43,  4.97s/it]
 82%|████████▏ | 205/249 [17:00<03:38,  4.97s/it]
 83%|████████▎ | 206/249 [17:05<03:33,  4.97s/it]
 83%|████████▎ | 207/249 [17:10<03:28,  4.97s/it]
 84%|████████▎ | 208/249 [17:15<03:23,  4.97s/it]
 84%|████████▍ | 209/249 [17:20<03:19,  4.98s/it]
 84%|████████▍ | 210/249 [17:25<03:14,  4.98s/it]
 85%|████████▍ | 211/249 [17:30<03:08,  4.97s/it]
 85%|████████▌ | 212/249 [17:35<03:04,  4.98s/it]
 86%|████████▌ | 213/249 [17:40<02:59,  4.98s/it]
 86%|████████▌ | 214/249 [17:45<02:54,  4.99s/it]
 86%|████████▋ | 215/249 [17:50<02:49,  4.99s/it]
 87%|████████▋ | 216/249 [17:55<02:44,  4.98s/it]
 87%|████████▋ | 217/249 [18:00<02:39,  4.98s/it]
 88%|████████▊ | 218/249 [18:05<02:34,  4.97s/it]
 88%|████████▊ | 219/249 [18:10<02:29,  4.97s/it]
 88%|████████▊ | 220/249 [18:15<02:24,  4.97s/it]
 89%|████████▉ | 221/249 [18:20<02:19,  4.96s/it]
 89%|████████▉ | 222/249 [18:25<02:14,  4.97s/it]
 90%|████████▉ | 223/249 [18:30<02:09,  4.97s/it]
 90%|████████▉ | 224/249 [18:35<02:04,  4.97s/it]
 90%|█████████ | 225/249 [18:40<01:59,  4.97s/it]
 91%|█████████ | 226/249 [18:45<01:54,  4.97s/it]
 91%|█████████ | 227/249 [18:49<01:49,  4.97s/it]
 92%|█████████▏| 228/249 [18:54<01:44,  4.97s/it]
 92%|█████████▏| 229/249 [18:59<01:39,  4.97s/it]
 92%|█████████▏| 230/249 [19:04<01:34,  4.97s/it]
 93%|█████████▎| 231/249 [19:09<01:29,  4.97s/it]
 93%|█████████▎| 232/249 [19:14<01:24,  4.96s/it]
 94%|█████████▎| 233/249 [19:19<01:19,  4.96s/it]
 94%|█████████▍| 234/249 [19:24<01:14,  4.96s/it]
 94%|█████████▍| 235/249 [19:29<01:09,  4.97s/it]
 95%|█████████▍| 236/249 [19:34<01:04,  4.96s/it]
 95%|█████████▌| 237/249 [19:39<00:59,  4.98s/it]
 96%|█████████▌| 238/249 [19:44<00:54,  4.98s/it]
 96%|█████████▌| 239/249 [19:49<00:49,  4.98s/it]
 96%|█████████▋| 240/249 [19:54<00:44,  4.97s/it]
 97%|█████████▋| 241/249 [19:59<00:39,  4.97s/it]
 97%|█████████▋| 242/249 [20:04<00:34,  4.97s/it]
 98%|█████████▊| 243/249 [20:09<00:29,  4.97s/it]
 98%|█████████▊| 244/249 [20:14<00:24,  4.97s/it]
 98%|█████████▊| 245/249 [20:19<00:19,  4.97s/it]
 99%|█████████▉| 246/249 [20:24<00:14,  4.97s/it]
 99%|█████████▉| 247/249 [20:29<00:09,  4.98s/it]
100%|█████████▉| 248/249 [20:34<00:04,  4.98s/it]
100%|██████████| 249/249 [20:39<00:00,  4.98s/it]
100%|██████████| 249/249 [20:39<00:00,  4.98s/it]

We obtain the following posterior trajectory

posterior sample DRUNetposterior trajectory DRUNet

Total running time of the script: (30 minutes 57.634 seconds)

Gallery generated by Sphinx-Gallery