Solving blind inverse problems / estimating physics parameters#

This demo shows you how to use deepinv.physics.Physics together with automatic differentiation to optimize your operator.

Consider the forward model

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

where \(N\) is the noise model, \(\forw{\cdot, \theta}\) is the forward operator, and the goal is to learn the parameter \(\theta\) (e.g., the filter in deepinv.physics.Blur).

In a typical blind inverse problem, given a measurement \(y\), we would like to recover both the underlying image \(x\) and the operator parameter \(\theta\), resulting in a highly ill-posed inverse problem.

In this example, we only focus on a much more simpler problem: given the measurement \(y\) and the ground truth \(x\), find the parameter \(\theta\). This can be reformulated as the following optimization problem:

\[\min_{\theta} \frac{1}{2} \|\forw{x, \theta} - y \|^2\]

This problem can be addressed by first-order optimization if we can compute the gradient of the above function with respect to \(\theta\). The dependence between the operator \(A\) and the parameter \(\theta\) can be complicated. DeepInverse provides a wide range of physics operators, implemented as differentiable classes. We can leverage the automatic differentiation engine provided in Pytorch to compute the gradient of the above loss function w.r.t. the physics parameters \(\theta\).

The purpose of this demo is to show how to use the physics classes in DeepInverse to estimate the physics parameters, together with the automatic differentiation. We show 3 different ways to do this: manually implementing the projected gradient descent algorithm, using a Pytorch optimizer and optimizing the physics as a usual neural network.

Import required packages

import deepinv as dinv
import torch
from tqdm import tqdm
import matplotlib.pyplot as plt

device = dinv.utils.get_freer_gpu() if torch.cuda.is_available() else "cpu"
dtype = torch.float32

Define the physics#

In this first example, we use the convolution operator, defined in the deepinv.physics.Blur class. We also generate a random convolution kernel of motion blur

x = dinv.utils.load_url_image(
    dinv.utils.get_image_url("celeba_example.jpg"),
    img_size=256,
    resize_mode="resize",
).to(device)

y = physics(x, filter=true_kernel)

dinv.utils.plot([x, y, true_kernel], titles=["Sharp", "Blurry", "True kernel"])
Sharp, Blurry, True kernel

Define an optimization algorithm#

The convolution kernel lives in the simplex, ie the kernel must have positive entries summing to 1. We can use a simple optimization algorithm - Projected Gradient Descent - to enforce this constraint. The following function allows one to compute the orthogonal projection onto the simplex, by a sorting algorithm (Reference: Large-scale Multiclass Support Vector Machine Training via Euclidean Projection onto the Simplex – Mathieu Blondel, Akinori Fujino, and Naonori Ueda)

@torch.no_grad()
def projection_simplex_sort(v: torch.Tensor) -> torch.Tensor:
    r"""
    Projects a tensor onto the simplex using a sorting algorithm.
    """
    shape = v.shape
    B = shape[0]
    v = v.view(B, -1)
    n_features = v.size(1)
    u = torch.sort(v, descending=True, dim=-1).values
    cssv = torch.cumsum(u, dim=-1) - 1.0
    ind = torch.arange(n_features, device=v.device)[None, :].expand(B, -1) + 1.0
    cond = u - cssv / ind > 0
    rho = ind[cond][-1]
    theta = cssv[cond][-1] / rho
    w = torch.maximum(v - theta, torch.zeros_like(v))
    return w.reshape(shape)


# We also define a data fidelity term
data_fidelity = dinv.optim.L2()

Run the algorithm

Initialize a constant kernel

kernel_init = torch.zeros_like(true_kernel)
kernel_init[..., 5:-5, 5:-5] = 1.0
kernel_init = projection_simplex_sort(kernel_init)
n_iter = 1000
stepsize = 0.7

kernel_hat = kernel_init
losses = []
for i in tqdm(range(n_iter)):
    # compute the gradient
    with torch.enable_grad():
        kernel_hat.requires_grad_(True)
        physics.update(filter=kernel_hat)
        loss = data_fidelity(y=y, x=x, physics=physics) / y.numel()
        loss.backward()
    grad = kernel_hat.grad

    # gradient step and projection step
    with torch.no_grad():
        kernel_hat = kernel_hat - stepsize * grad
        kernel_hat = projection_simplex_sort(kernel_hat)

    losses.append(loss.item())

dinv.utils.plot(
    [true_kernel, kernel_init, kernel_hat],
    titles=["True kernel", "Init. kernel", "Estimated kernel"],
    suptitle="Result with Projected Gradient Descent",
)
Result with Projected Gradient Descent, True kernel, Init. kernel, Estimated kernel
  0%|          | 0/1000 [00:00<?, ?it/s]
  0%|          | 2/1000 [00:00<01:06, 15.01it/s]
  0%|          | 4/1000 [00:00<01:05, 15.11it/s]
  1%|          | 6/1000 [00:00<01:05, 15.21it/s]
  1%|          | 8/1000 [00:00<01:04, 15.37it/s]
  1%|          | 10/1000 [00:00<01:03, 15.50it/s]
  1%|          | 12/1000 [00:00<01:03, 15.58it/s]
  1%|▏         | 14/1000 [00:00<01:03, 15.63it/s]
  2%|▏         | 16/1000 [00:01<01:02, 15.67it/s]
  2%|▏         | 18/1000 [00:01<01:02, 15.68it/s]
  2%|▏         | 20/1000 [00:01<01:02, 15.66it/s]
  2%|▏         | 22/1000 [00:01<01:02, 15.66it/s]
  2%|▏         | 24/1000 [00:01<01:02, 15.70it/s]
  3%|β–Ž         | 26/1000 [00:01<01:02, 15.70it/s]
  3%|β–Ž         | 28/1000 [00:01<01:01, 15.70it/s]
  3%|β–Ž         | 30/1000 [00:01<01:01, 15.71it/s]
  3%|β–Ž         | 32/1000 [00:02<01:01, 15.72it/s]
  3%|β–Ž         | 34/1000 [00:02<01:01, 15.73it/s]
  4%|β–Ž         | 36/1000 [00:02<01:01, 15.71it/s]
  4%|▍         | 38/1000 [00:02<01:01, 15.71it/s]
  4%|▍         | 40/1000 [00:02<01:01, 15.74it/s]
  4%|▍         | 42/1000 [00:02<01:00, 15.73it/s]
  4%|▍         | 44/1000 [00:02<01:00, 15.74it/s]
  5%|▍         | 46/1000 [00:02<01:00, 15.75it/s]
  5%|▍         | 48/1000 [00:03<01:00, 15.76it/s]
  5%|β–Œ         | 50/1000 [00:03<01:00, 15.79it/s]
  5%|β–Œ         | 52/1000 [00:03<01:00, 15.80it/s]
  5%|β–Œ         | 54/1000 [00:03<00:59, 15.80it/s]
  6%|β–Œ         | 56/1000 [00:03<00:59, 15.82it/s]
  6%|β–Œ         | 58/1000 [00:03<00:59, 15.83it/s]
  6%|β–Œ         | 60/1000 [00:03<00:59, 15.82it/s]
  6%|β–Œ         | 62/1000 [00:03<00:59, 15.83it/s]
  6%|β–‹         | 64/1000 [00:04<00:59, 15.83it/s]
  7%|β–‹         | 66/1000 [00:04<00:59, 15.78it/s]
  7%|β–‹         | 68/1000 [00:04<01:00, 15.53it/s]
  7%|β–‹         | 70/1000 [00:04<00:59, 15.60it/s]
  7%|β–‹         | 72/1000 [00:04<00:59, 15.59it/s]
  7%|β–‹         | 74/1000 [00:04<00:59, 15.64it/s]
  8%|β–Š         | 76/1000 [00:04<00:58, 15.67it/s]
  8%|β–Š         | 78/1000 [00:04<00:58, 15.69it/s]
  8%|β–Š         | 80/1000 [00:05<00:58, 15.69it/s]
  8%|β–Š         | 82/1000 [00:05<00:58, 15.72it/s]
  8%|β–Š         | 84/1000 [00:05<00:58, 15.61it/s]
  9%|β–Š         | 86/1000 [00:05<00:58, 15.63it/s]
  9%|β–‰         | 88/1000 [00:05<00:58, 15.65it/s]
  9%|β–‰         | 90/1000 [00:05<00:58, 15.58it/s]
  9%|β–‰         | 92/1000 [00:05<00:58, 15.60it/s]
  9%|β–‰         | 94/1000 [00:05<00:57, 15.65it/s]
 10%|β–‰         | 96/1000 [00:06<00:57, 15.69it/s]
 10%|β–‰         | 98/1000 [00:06<00:57, 15.72it/s]
 10%|β–ˆ         | 100/1000 [00:06<00:57, 15.71it/s]
 10%|β–ˆ         | 102/1000 [00:06<00:57, 15.73it/s]
 10%|β–ˆ         | 104/1000 [00:06<00:56, 15.75it/s]
 11%|β–ˆ         | 106/1000 [00:06<00:56, 15.75it/s]
 11%|β–ˆ         | 108/1000 [00:06<00:56, 15.76it/s]
 11%|β–ˆ         | 110/1000 [00:07<00:56, 15.76it/s]
 11%|β–ˆ         | 112/1000 [00:07<00:56, 15.77it/s]
 11%|β–ˆβ–        | 114/1000 [00:07<00:56, 15.77it/s]
 12%|β–ˆβ–        | 116/1000 [00:07<00:56, 15.73it/s]
 12%|β–ˆβ–        | 118/1000 [00:07<00:56, 15.74it/s]
 12%|β–ˆβ–        | 120/1000 [00:07<00:55, 15.77it/s]
 12%|β–ˆβ–        | 122/1000 [00:07<00:55, 15.74it/s]
 12%|β–ˆβ–        | 124/1000 [00:07<00:55, 15.74it/s]
 13%|β–ˆβ–Ž        | 126/1000 [00:08<00:55, 15.74it/s]
 13%|β–ˆβ–Ž        | 128/1000 [00:08<00:55, 15.71it/s]
 13%|β–ˆβ–Ž        | 130/1000 [00:08<00:55, 15.71it/s]
 13%|β–ˆβ–Ž        | 132/1000 [00:08<00:55, 15.72it/s]
 13%|β–ˆβ–Ž        | 134/1000 [00:08<00:55, 15.73it/s]
 14%|β–ˆβ–Ž        | 136/1000 [00:08<00:54, 15.74it/s]
 14%|β–ˆβ–        | 138/1000 [00:08<00:54, 15.75it/s]
 14%|β–ˆβ–        | 140/1000 [00:08<00:55, 15.57it/s]
 14%|β–ˆβ–        | 142/1000 [00:09<00:55, 15.52it/s]
 14%|β–ˆβ–        | 144/1000 [00:09<00:54, 15.59it/s]
 15%|β–ˆβ–        | 146/1000 [00:09<00:54, 15.62it/s]
 15%|β–ˆβ–        | 148/1000 [00:09<00:54, 15.62it/s]
 15%|β–ˆβ–Œ        | 150/1000 [00:09<00:54, 15.63it/s]
 15%|β–ˆβ–Œ        | 152/1000 [00:09<00:54, 15.68it/s]
 15%|β–ˆβ–Œ        | 154/1000 [00:09<00:53, 15.68it/s]
 16%|β–ˆβ–Œ        | 156/1000 [00:09<00:53, 15.69it/s]
 16%|β–ˆβ–Œ        | 158/1000 [00:10<00:53, 15.69it/s]
 16%|β–ˆβ–Œ        | 160/1000 [00:10<00:53, 15.71it/s]
 16%|β–ˆβ–Œ        | 162/1000 [00:10<00:53, 15.74it/s]
 16%|β–ˆβ–‹        | 164/1000 [00:10<00:53, 15.75it/s]
 17%|β–ˆβ–‹        | 166/1000 [00:10<00:53, 15.71it/s]
 17%|β–ˆβ–‹        | 168/1000 [00:10<00:52, 15.75it/s]
 17%|β–ˆβ–‹        | 170/1000 [00:10<00:52, 15.77it/s]
 17%|β–ˆβ–‹        | 172/1000 [00:10<00:52, 15.79it/s]
 17%|β–ˆβ–‹        | 174/1000 [00:11<00:52, 15.81it/s]
 18%|β–ˆβ–Š        | 176/1000 [00:11<00:52, 15.83it/s]
 18%|β–ˆβ–Š        | 178/1000 [00:11<00:52, 15.80it/s]
 18%|β–ˆβ–Š        | 180/1000 [00:11<00:51, 15.80it/s]
 18%|β–ˆβ–Š        | 182/1000 [00:11<00:51, 15.83it/s]
 18%|β–ˆβ–Š        | 184/1000 [00:11<00:51, 15.84it/s]
 19%|β–ˆβ–Š        | 186/1000 [00:11<00:51, 15.85it/s]
 19%|β–ˆβ–‰        | 188/1000 [00:11<00:51, 15.86it/s]
 19%|β–ˆβ–‰        | 190/1000 [00:12<00:51, 15.85it/s]
 19%|β–ˆβ–‰        | 192/1000 [00:12<00:50, 15.87it/s]
 19%|β–ˆβ–‰        | 194/1000 [00:12<00:50, 15.88it/s]
 20%|β–ˆβ–‰        | 196/1000 [00:12<00:50, 15.84it/s]
 20%|β–ˆβ–‰        | 198/1000 [00:12<00:50, 15.82it/s]
 20%|β–ˆβ–ˆ        | 200/1000 [00:12<00:50, 15.79it/s]
 20%|β–ˆβ–ˆ        | 202/1000 [00:12<00:50, 15.79it/s]
 20%|β–ˆβ–ˆ        | 204/1000 [00:12<00:50, 15.77it/s]
 21%|β–ˆβ–ˆ        | 206/1000 [00:13<00:50, 15.76it/s]
 21%|β–ˆβ–ˆ        | 208/1000 [00:13<00:50, 15.75it/s]
 21%|β–ˆβ–ˆ        | 210/1000 [00:13<00:50, 15.77it/s]
 21%|β–ˆβ–ˆ        | 212/1000 [00:13<00:49, 15.77it/s]
 21%|β–ˆβ–ˆβ–       | 214/1000 [00:13<00:49, 15.81it/s]
 22%|β–ˆβ–ˆβ–       | 216/1000 [00:13<00:49, 15.82it/s]
 22%|β–ˆβ–ˆβ–       | 218/1000 [00:13<00:49, 15.81it/s]
 22%|β–ˆβ–ˆβ–       | 220/1000 [00:13<00:49, 15.78it/s]
 22%|β–ˆβ–ˆβ–       | 222/1000 [00:14<00:52, 14.90it/s]
 22%|β–ˆβ–ˆβ–       | 224/1000 [00:14<00:51, 15.10it/s]
 23%|β–ˆβ–ˆβ–Ž       | 226/1000 [00:14<00:50, 15.20it/s]
 23%|β–ˆβ–ˆβ–Ž       | 228/1000 [00:14<00:50, 15.33it/s]
 23%|β–ˆβ–ˆβ–Ž       | 230/1000 [00:14<00:49, 15.44it/s]
 23%|β–ˆβ–ˆβ–Ž       | 232/1000 [00:14<00:49, 15.53it/s]
 23%|β–ˆβ–ˆβ–Ž       | 234/1000 [00:14<00:49, 15.62it/s]
 24%|β–ˆβ–ˆβ–Ž       | 236/1000 [00:15<00:48, 15.66it/s]
 24%|β–ˆβ–ˆβ–       | 238/1000 [00:15<00:48, 15.67it/s]
 24%|β–ˆβ–ˆβ–       | 240/1000 [00:15<00:48, 15.68it/s]
 24%|β–ˆβ–ˆβ–       | 242/1000 [00:15<00:48, 15.65it/s]
 24%|β–ˆβ–ˆβ–       | 244/1000 [00:15<00:48, 15.67it/s]
 25%|β–ˆβ–ˆβ–       | 246/1000 [00:15<00:48, 15.58it/s]
 25%|β–ˆβ–ˆβ–       | 248/1000 [00:15<00:48, 15.58it/s]
 25%|β–ˆβ–ˆβ–Œ       | 250/1000 [00:15<00:48, 15.56it/s]
 25%|β–ˆβ–ˆβ–Œ       | 252/1000 [00:16<00:47, 15.63it/s]
 25%|β–ˆβ–ˆβ–Œ       | 254/1000 [00:16<00:48, 15.42it/s]
 26%|β–ˆβ–ˆβ–Œ       | 256/1000 [00:16<00:48, 15.50it/s]
 26%|β–ˆβ–ˆβ–Œ       | 258/1000 [00:16<00:47, 15.52it/s]
 26%|β–ˆβ–ˆβ–Œ       | 260/1000 [00:16<00:47, 15.51it/s]
 26%|β–ˆβ–ˆβ–Œ       | 262/1000 [00:16<00:47, 15.59it/s]
 26%|β–ˆβ–ˆβ–‹       | 264/1000 [00:16<00:47, 15.65it/s]
 27%|β–ˆβ–ˆβ–‹       | 266/1000 [00:16<00:46, 15.71it/s]
 27%|β–ˆβ–ˆβ–‹       | 268/1000 [00:17<00:46, 15.74it/s]
 27%|β–ˆβ–ˆβ–‹       | 270/1000 [00:17<00:46, 15.77it/s]
 27%|β–ˆβ–ˆβ–‹       | 272/1000 [00:17<00:46, 15.77it/s]
 27%|β–ˆβ–ˆβ–‹       | 274/1000 [00:17<00:46, 15.76it/s]
 28%|β–ˆβ–ˆβ–Š       | 276/1000 [00:17<00:45, 15.78it/s]
 28%|β–ˆβ–ˆβ–Š       | 278/1000 [00:17<00:45, 15.78it/s]
 28%|β–ˆβ–ˆβ–Š       | 280/1000 [00:17<00:45, 15.78it/s]
 28%|β–ˆβ–ˆβ–Š       | 282/1000 [00:17<00:45, 15.77it/s]
 28%|β–ˆβ–ˆβ–Š       | 284/1000 [00:18<00:45, 15.79it/s]
 29%|β–ˆβ–ˆβ–Š       | 286/1000 [00:18<00:45, 15.80it/s]
 29%|β–ˆβ–ˆβ–‰       | 288/1000 [00:18<00:45, 15.80it/s]
 29%|β–ˆβ–ˆβ–‰       | 290/1000 [00:18<00:44, 15.80it/s]
 29%|β–ˆβ–ˆβ–‰       | 292/1000 [00:18<00:44, 15.82it/s]
 29%|β–ˆβ–ˆβ–‰       | 294/1000 [00:18<00:44, 15.85it/s]
 30%|β–ˆβ–ˆβ–‰       | 296/1000 [00:18<00:44, 15.83it/s]
 30%|β–ˆβ–ˆβ–‰       | 298/1000 [00:18<00:44, 15.82it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 300/1000 [00:19<00:44, 15.78it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 302/1000 [00:19<00:44, 15.55it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 304/1000 [00:19<00:44, 15.60it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 306/1000 [00:19<00:44, 15.65it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 308/1000 [00:19<00:44, 15.70it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 310/1000 [00:19<00:43, 15.74it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 312/1000 [00:19<00:43, 15.76it/s]
 31%|β–ˆβ–ˆβ–ˆβ–      | 314/1000 [00:20<00:43, 15.79it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 316/1000 [00:20<00:43, 15.81it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 318/1000 [00:20<00:43, 15.83it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 320/1000 [00:20<00:43, 15.81it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 322/1000 [00:20<00:42, 15.82it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 324/1000 [00:20<00:42, 15.83it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 326/1000 [00:20<00:42, 15.83it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 328/1000 [00:20<00:42, 15.82it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 330/1000 [00:21<00:42, 15.80it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 332/1000 [00:21<00:42, 15.77it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 334/1000 [00:21<00:42, 15.75it/s]
 34%|β–ˆβ–ˆβ–ˆβ–Ž      | 336/1000 [00:21<00:42, 15.71it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 338/1000 [00:21<00:42, 15.69it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 340/1000 [00:21<00:42, 15.68it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 342/1000 [00:21<00:41, 15.68it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 344/1000 [00:21<00:41, 15.68it/s]
 35%|β–ˆβ–ˆβ–ˆβ–      | 346/1000 [00:22<00:41, 15.67it/s]
 35%|β–ˆβ–ˆβ–ˆβ–      | 348/1000 [00:22<00:41, 15.67it/s]
 35%|β–ˆβ–ˆβ–ˆβ–Œ      | 350/1000 [00:22<00:41, 15.69it/s]
 35%|β–ˆβ–ˆβ–ˆβ–Œ      | 352/1000 [00:22<00:41, 15.68it/s]
 35%|β–ˆβ–ˆβ–ˆβ–Œ      | 354/1000 [00:22<00:41, 15.68it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 356/1000 [00:22<00:41, 15.64it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 358/1000 [00:22<00:41, 15.47it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 360/1000 [00:22<00:42, 15.22it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 362/1000 [00:23<00:43, 14.65it/s]
 36%|β–ˆβ–ˆβ–ˆβ–‹      | 364/1000 [00:23<00:42, 14.95it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 366/1000 [00:23<00:41, 15.18it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 368/1000 [00:23<00:41, 15.37it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 370/1000 [00:23<00:40, 15.52it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 372/1000 [00:23<00:40, 15.62it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 374/1000 [00:23<00:39, 15.70it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 376/1000 [00:23<00:39, 15.77it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 378/1000 [00:24<00:39, 15.79it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 380/1000 [00:24<00:39, 15.80it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 382/1000 [00:24<00:39, 15.78it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 384/1000 [00:24<00:39, 15.78it/s]
 39%|β–ˆβ–ˆβ–ˆβ–Š      | 386/1000 [00:24<00:38, 15.80it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 388/1000 [00:24<00:38, 15.82it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 390/1000 [00:24<00:38, 15.83it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 392/1000 [00:24<00:38, 15.84it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 394/1000 [00:25<00:38, 15.85it/s]
 40%|β–ˆβ–ˆβ–ˆβ–‰      | 396/1000 [00:25<00:38, 15.85it/s]
 40%|β–ˆβ–ˆβ–ˆβ–‰      | 398/1000 [00:25<00:37, 15.85it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 400/1000 [00:25<00:37, 15.86it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 402/1000 [00:25<00:37, 15.86it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 404/1000 [00:25<00:37, 15.77it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 406/1000 [00:25<00:37, 15.65it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 408/1000 [00:26<00:37, 15.70it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 410/1000 [00:26<00:37, 15.75it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 412/1000 [00:26<00:37, 15.78it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 414/1000 [00:26<00:37, 15.79it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 416/1000 [00:26<00:36, 15.80it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 418/1000 [00:26<00:36, 15.83it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 420/1000 [00:26<00:36, 15.85it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 422/1000 [00:26<00:36, 15.85it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 424/1000 [00:27<00:36, 15.86it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 426/1000 [00:27<00:36, 15.87it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 428/1000 [00:27<00:36, 15.86it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 430/1000 [00:27<00:36, 15.82it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 432/1000 [00:27<00:35, 15.84it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 434/1000 [00:27<00:35, 15.84it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 436/1000 [00:27<00:35, 15.86it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 438/1000 [00:27<00:35, 15.85it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 440/1000 [00:28<00:35, 15.86it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 442/1000 [00:28<00:35, 15.86it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 444/1000 [00:28<00:35, 15.87it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 446/1000 [00:28<00:34, 15.85it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 448/1000 [00:28<00:34, 15.85it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 450/1000 [00:28<00:34, 15.76it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 452/1000 [00:28<00:34, 15.79it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 454/1000 [00:28<00:34, 15.72it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 456/1000 [00:29<00:34, 15.74it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 458/1000 [00:29<00:34, 15.75it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 460/1000 [00:29<00:34, 15.80it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 462/1000 [00:29<00:34, 15.74it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 464/1000 [00:29<00:33, 15.78it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 466/1000 [00:29<00:33, 15.80it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 468/1000 [00:29<00:33, 15.83it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 470/1000 [00:29<00:33, 15.84it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 472/1000 [00:30<00:33, 15.85it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 474/1000 [00:30<00:33, 15.85it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 476/1000 [00:30<00:33, 15.87it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 478/1000 [00:30<00:32, 15.85it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 480/1000 [00:30<00:32, 15.84it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 482/1000 [00:30<00:32, 15.85it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 484/1000 [00:30<00:32, 15.86it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 486/1000 [00:30<00:32, 15.85it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 488/1000 [00:31<00:32, 15.85it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 490/1000 [00:31<00:32, 15.86it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 492/1000 [00:31<00:32, 15.87it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 494/1000 [00:31<00:32, 15.81it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 496/1000 [00:31<00:31, 15.82it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 498/1000 [00:31<00:31, 15.81it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 500/1000 [00:31<00:31, 15.80it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 502/1000 [00:31<00:31, 15.80it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 504/1000 [00:32<00:31, 15.76it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 506/1000 [00:32<00:31, 15.76it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 508/1000 [00:32<00:31, 15.75it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 510/1000 [00:32<00:31, 15.76it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 512/1000 [00:32<00:30, 15.77it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 514/1000 [00:32<00:30, 15.78it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 516/1000 [00:32<00:30, 15.79it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 518/1000 [00:32<00:30, 15.79it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 520/1000 [00:33<00:30, 15.77it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 522/1000 [00:33<00:30, 15.76it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 524/1000 [00:33<00:30, 15.76it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 526/1000 [00:33<00:30, 15.77it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 528/1000 [00:33<00:29, 15.79it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 530/1000 [00:33<00:29, 15.81it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 532/1000 [00:33<00:29, 15.82it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 534/1000 [00:33<00:29, 15.82it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 536/1000 [00:34<00:29, 15.81it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 538/1000 [00:34<00:29, 15.82it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 540/1000 [00:34<00:29, 15.82it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 542/1000 [00:34<00:28, 15.82it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 544/1000 [00:34<00:29, 15.69it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 546/1000 [00:34<00:28, 15.68it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 548/1000 [00:34<00:28, 15.69it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 550/1000 [00:34<00:28, 15.69it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 552/1000 [00:35<00:28, 15.70it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 554/1000 [00:35<00:28, 15.73it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 556/1000 [00:35<00:28, 15.75it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 558/1000 [00:35<00:28, 15.77it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 560/1000 [00:35<00:27, 15.77it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 562/1000 [00:35<00:27, 15.73it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 564/1000 [00:35<00:27, 15.74it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 566/1000 [00:36<00:28, 15.30it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 568/1000 [00:36<00:28, 15.32it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 570/1000 [00:36<00:27, 15.45it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 572/1000 [00:36<00:27, 15.53it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 574/1000 [00:36<00:27, 15.57it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 576/1000 [00:36<00:27, 15.59it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 578/1000 [00:36<00:27, 15.62it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 580/1000 [00:36<00:26, 15.64it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 582/1000 [00:37<00:26, 15.66it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 584/1000 [00:37<00:26, 15.68it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 586/1000 [00:37<00:26, 15.69it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 588/1000 [00:37<00:26, 15.70it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 590/1000 [00:37<00:26, 15.73it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 592/1000 [00:37<00:25, 15.77it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 594/1000 [00:37<00:25, 15.80it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 596/1000 [00:37<00:25, 15.82it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 598/1000 [00:38<00:25, 15.83it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 600/1000 [00:38<00:25, 15.85it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 602/1000 [00:38<00:25, 15.85it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 604/1000 [00:38<00:25, 15.84it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 606/1000 [00:38<00:24, 15.85it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 608/1000 [00:38<00:24, 15.86it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 610/1000 [00:38<00:24, 15.88it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 612/1000 [00:38<00:24, 15.89it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 614/1000 [00:39<00:24, 15.84it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 616/1000 [00:39<00:24, 15.80it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 618/1000 [00:39<00:24, 15.77it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 620/1000 [00:39<00:24, 15.73it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 622/1000 [00:39<00:26, 14.11it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 624/1000 [00:39<00:25, 14.53it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 626/1000 [00:39<00:25, 14.90it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 628/1000 [00:40<00:24, 15.16it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 630/1000 [00:40<00:24, 15.37it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 632/1000 [00:40<00:23, 15.52it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 634/1000 [00:40<00:23, 15.59it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 636/1000 [00:40<00:23, 15.66it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 638/1000 [00:40<00:23, 15.63it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 640/1000 [00:40<00:22, 15.68it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 642/1000 [00:40<00:22, 15.73it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 644/1000 [00:41<00:22, 15.77it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 646/1000 [00:41<00:22, 15.79it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 648/1000 [00:41<00:22, 15.82it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 650/1000 [00:41<00:22, 15.82it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 652/1000 [00:41<00:21, 15.83it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 654/1000 [00:41<00:21, 15.83it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 656/1000 [00:41<00:21, 15.82it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 658/1000 [00:41<00:21, 15.79it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 660/1000 [00:42<00:21, 15.78it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 662/1000 [00:42<00:21, 15.77it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 664/1000 [00:42<00:21, 15.80it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 666/1000 [00:42<00:21, 15.78it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 668/1000 [00:42<00:21, 15.80it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 670/1000 [00:42<00:20, 15.82it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 672/1000 [00:42<00:20, 15.84it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 674/1000 [00:42<00:20, 15.86it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 676/1000 [00:43<00:20, 15.85it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 678/1000 [00:43<00:20, 15.84it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 680/1000 [00:43<00:20, 15.81it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 682/1000 [00:43<00:20, 15.75it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 684/1000 [00:43<00:20, 15.77it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 686/1000 [00:43<00:19, 15.79it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 688/1000 [00:43<00:19, 15.64it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 690/1000 [00:43<00:19, 15.65it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 692/1000 [00:44<00:19, 15.66it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 694/1000 [00:44<00:19, 15.67it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 696/1000 [00:44<00:19, 15.66it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 698/1000 [00:44<00:19, 15.58it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 700/1000 [00:44<00:19, 15.58it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 702/1000 [00:44<00:19, 15.60it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 704/1000 [00:44<00:18, 15.61it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 706/1000 [00:44<00:18, 15.63it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 708/1000 [00:45<00:18, 15.62it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 710/1000 [00:45<00:18, 15.63it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 712/1000 [00:45<00:18, 15.63it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 714/1000 [00:45<00:18, 15.61it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 716/1000 [00:45<00:18, 15.62it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 718/1000 [00:45<00:18, 15.61it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 720/1000 [00:45<00:18, 15.46it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 722/1000 [00:45<00:17, 15.53it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 724/1000 [00:46<00:17, 15.58it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 726/1000 [00:46<00:17, 15.61it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 728/1000 [00:46<00:17, 15.48it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 730/1000 [00:46<00:17, 15.53it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 732/1000 [00:46<00:17, 15.48it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 734/1000 [00:46<00:17, 15.55it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 736/1000 [00:46<00:16, 15.60it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 738/1000 [00:47<00:16, 15.64it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 740/1000 [00:47<00:16, 15.67it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 742/1000 [00:47<00:16, 15.69it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 744/1000 [00:47<00:16, 15.70it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 746/1000 [00:47<00:16, 15.68it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 748/1000 [00:47<00:16, 15.68it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 750/1000 [00:47<00:15, 15.66it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 752/1000 [00:47<00:15, 15.66it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 754/1000 [00:48<00:15, 15.65it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 756/1000 [00:48<00:15, 15.67it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 758/1000 [00:48<00:15, 15.71it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 760/1000 [00:48<00:15, 15.71it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 762/1000 [00:48<00:15, 15.74it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 764/1000 [00:48<00:14, 15.77it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 766/1000 [00:48<00:14, 15.79it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 768/1000 [00:48<00:14, 15.79it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 770/1000 [00:49<00:14, 15.78it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 772/1000 [00:49<00:14, 15.80it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 774/1000 [00:49<00:14, 15.79it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 776/1000 [00:49<00:14, 15.77it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 778/1000 [00:49<00:14, 15.78it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 780/1000 [00:49<00:13, 15.77it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 782/1000 [00:49<00:13, 15.77it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 784/1000 [00:49<00:13, 15.78it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 786/1000 [00:50<00:13, 15.76it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 788/1000 [00:50<00:13, 15.77it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 790/1000 [00:50<00:13, 15.77it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 792/1000 [00:50<00:13, 15.72it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 794/1000 [00:50<00:13, 15.76it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 796/1000 [00:50<00:12, 15.78it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 798/1000 [00:50<00:12, 15.73it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 800/1000 [00:50<00:13, 15.03it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 802/1000 [00:51<00:12, 15.25it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 804/1000 [00:51<00:12, 15.41it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 806/1000 [00:51<00:12, 15.54it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 808/1000 [00:51<00:12, 15.61it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 810/1000 [00:51<00:12, 15.68it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 812/1000 [00:51<00:11, 15.73it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 814/1000 [00:51<00:11, 15.76it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 816/1000 [00:51<00:11, 15.78it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 818/1000 [00:52<00:11, 15.79it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 820/1000 [00:52<00:11, 15.80it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 822/1000 [00:52<00:11, 15.81it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 824/1000 [00:52<00:11, 15.79it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 826/1000 [00:52<00:10, 15.82it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 828/1000 [00:52<00:10, 15.75it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 830/1000 [00:52<00:10, 15.76it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 832/1000 [00:52<00:10, 15.76it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 834/1000 [00:53<00:10, 15.76it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 836/1000 [00:53<00:10, 15.78it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 838/1000 [00:53<00:10, 15.80it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 840/1000 [00:53<00:10, 15.82it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 842/1000 [00:53<00:09, 15.83it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 844/1000 [00:53<00:09, 15.84it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 846/1000 [00:53<00:09, 15.87it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 848/1000 [00:54<00:09, 15.88it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 850/1000 [00:54<00:09, 15.87it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 852/1000 [00:54<00:09, 15.85it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 854/1000 [00:54<00:09, 15.83it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 856/1000 [00:54<00:09, 15.83it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 858/1000 [00:54<00:08, 15.83it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 860/1000 [00:54<00:08, 15.83it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 862/1000 [00:54<00:08, 15.83it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 864/1000 [00:55<00:08, 15.82it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 866/1000 [00:55<00:08, 15.78it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 868/1000 [00:55<00:08, 15.76it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 870/1000 [00:55<00:08, 15.74it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 872/1000 [00:55<00:08, 15.77it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 874/1000 [00:55<00:07, 15.79it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 876/1000 [00:55<00:07, 15.76it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 878/1000 [00:55<00:07, 15.79it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 880/1000 [00:56<00:07, 15.81it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 882/1000 [00:56<00:07, 15.80it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 884/1000 [00:56<00:07, 15.78it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 886/1000 [00:56<00:07, 15.05it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 888/1000 [00:56<00:07, 15.20it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 890/1000 [00:56<00:07, 15.35it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 892/1000 [00:56<00:06, 15.48it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 894/1000 [00:56<00:06, 15.57it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 896/1000 [00:57<00:06, 15.64it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 898/1000 [00:57<00:06, 15.69it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 900/1000 [00:57<00:06, 15.71it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 902/1000 [00:57<00:06, 15.69it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 904/1000 [00:57<00:06, 15.73it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 906/1000 [00:57<00:05, 15.74it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 908/1000 [00:57<00:05, 15.67it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 910/1000 [00:57<00:05, 15.71it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 912/1000 [00:58<00:05, 15.67it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 914/1000 [00:58<00:05, 15.69it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 916/1000 [00:58<00:05, 15.71it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 918/1000 [00:58<00:05, 15.73it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 920/1000 [00:58<00:05, 15.78it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 922/1000 [00:58<00:04, 15.71it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 924/1000 [00:58<00:04, 15.75it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 926/1000 [00:58<00:04, 15.78it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 928/1000 [00:59<00:04, 15.78it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 930/1000 [00:59<00:04, 15.80it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 932/1000 [00:59<00:04, 15.80it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 934/1000 [00:59<00:04, 15.79it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 936/1000 [00:59<00:04, 15.81it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 938/1000 [00:59<00:03, 15.81it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 940/1000 [00:59<00:03, 15.84it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 942/1000 [00:59<00:03, 15.84it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 944/1000 [01:00<00:03, 15.83it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 946/1000 [01:00<00:03, 15.84it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 948/1000 [01:00<00:03, 15.81it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 950/1000 [01:00<00:03, 15.78it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 952/1000 [01:00<00:03, 15.79it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 954/1000 [01:00<00:02, 15.79it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 956/1000 [01:00<00:02, 15.81it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 958/1000 [01:00<00:02, 15.81it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 960/1000 [01:01<00:02, 15.81it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 962/1000 [01:01<00:02, 15.80it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 964/1000 [01:01<00:02, 15.79it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 966/1000 [01:01<00:02, 15.78it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 968/1000 [01:01<00:02, 15.77it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 970/1000 [01:01<00:01, 15.78it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 972/1000 [01:01<00:01, 15.76it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 974/1000 [01:02<00:01, 15.75it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 976/1000 [01:02<00:01, 15.77it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 978/1000 [01:02<00:01, 15.77it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 980/1000 [01:02<00:01, 15.76it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 982/1000 [01:02<00:01, 15.78it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 984/1000 [01:02<00:01, 15.79it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 986/1000 [01:02<00:00, 15.82it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 988/1000 [01:02<00:00, 15.82it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 990/1000 [01:03<00:00, 15.81it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 992/1000 [01:03<00:00, 15.83it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 994/1000 [01:03<00:00, 15.82it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 996/1000 [01:03<00:00, 15.78it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 998/1000 [01:03<00:00, 15.76it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 1000/1000 [01:03<00:00, 15.77it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 1000/1000 [01:03<00:00, 15.71it/s]
/home/runner/work/deepinv/deepinv/deepinv/utils/plotting.py:379: UserWarning: This figure was using a layout engine that is incompatible with subplots_adjust and/or tight_layout; not calling subplots_adjust.
  fig.subplots_adjust(top=0.75)

We can plot the loss to make sure that it decreases

plt.figure()
plt.plot(range(n_iter), losses)
plt.title("Loss evolution")
plt.yscale("log")
plt.xlabel("Iteration")
plt.tight_layout()
plt.show()
Loss evolution

Combine with arbitrary optimizer#

Pytorch provides a wide range of optimizers for training neural networks. We can also pick one of those to optimizer our parameter

kernel_init = torch.zeros_like(true_kernel)
kernel_init[..., 5:-5, 5:-5] = 1.0
kernel_init = projection_simplex_sort(kernel_init)

kernel_hat = kernel_init.clone()
optimizer = torch.optim.Adam([kernel_hat], lr=0.1)

# We will alternate a gradient step and a projection step
losses = []
n_iter = 200
for i in tqdm(range(n_iter)):
    optimizer.zero_grad()
    # compute the gradient, this will directly change the gradient of `kernel_hat`
    with torch.enable_grad():
        kernel_hat.requires_grad_(True)
        physics.update(filter=kernel_hat)
        loss = data_fidelity(y=y, x=x, physics=physics) / y.numel()
        loss.backward()

    # a gradient step
    optimizer.step()
    # projection step, when doing additional steps, it's important to change only
    # the tensor data to avoid breaking the gradient computation
    kernel_hat.data = projection_simplex_sort(kernel_hat.data)
    # loss
    losses.append(loss.item())

dinv.utils.plot(
    [true_kernel, kernel_init, kernel_hat],
    titles=["True kernel", "Init. kernel", "Estimated kernel"],
    suptitle="Result with ADAM",
)
Result with ADAM, True kernel, Init. kernel, Estimated kernel
  0%|          | 0/200 [00:00<?, ?it/s]
  1%|          | 2/200 [00:00<00:13, 14.96it/s]
  2%|▏         | 4/200 [00:00<00:12, 15.18it/s]
  3%|β–Ž         | 6/200 [00:00<00:12, 15.30it/s]
  4%|▍         | 8/200 [00:00<00:12, 15.37it/s]
  5%|β–Œ         | 10/200 [00:00<00:12, 15.47it/s]
  6%|β–Œ         | 12/200 [00:00<00:12, 15.42it/s]
  7%|β–‹         | 14/200 [00:00<00:12, 15.49it/s]
  8%|β–Š         | 16/200 [00:01<00:11, 15.52it/s]
  9%|β–‰         | 18/200 [00:01<00:11, 15.57it/s]
 10%|β–ˆ         | 20/200 [00:01<00:11, 15.60it/s]
 11%|β–ˆ         | 22/200 [00:01<00:11, 15.64it/s]
 12%|β–ˆβ–        | 24/200 [00:01<00:11, 15.61it/s]
 13%|β–ˆβ–Ž        | 26/200 [00:01<00:11, 15.62it/s]
 14%|β–ˆβ–        | 28/200 [00:01<00:11, 15.55it/s]
 15%|β–ˆβ–Œ        | 30/200 [00:01<00:10, 15.47it/s]
 16%|β–ˆβ–Œ        | 32/200 [00:02<00:10, 15.52it/s]
 17%|β–ˆβ–‹        | 34/200 [00:02<00:10, 15.57it/s]
 18%|β–ˆβ–Š        | 36/200 [00:02<00:10, 15.62it/s]
 19%|β–ˆβ–‰        | 38/200 [00:02<00:10, 15.69it/s]
 20%|β–ˆβ–ˆ        | 40/200 [00:02<00:10, 15.70it/s]
 21%|β–ˆβ–ˆ        | 42/200 [00:02<00:10, 15.73it/s]
 22%|β–ˆβ–ˆβ–       | 44/200 [00:02<00:09, 15.74it/s]
 23%|β–ˆβ–ˆβ–Ž       | 46/200 [00:02<00:09, 15.65it/s]
 24%|β–ˆβ–ˆβ–       | 48/200 [00:03<00:09, 15.70it/s]
 25%|β–ˆβ–ˆβ–Œ       | 50/200 [00:03<00:09, 15.74it/s]
 26%|β–ˆβ–ˆβ–Œ       | 52/200 [00:03<00:09, 15.75it/s]
 27%|β–ˆβ–ˆβ–‹       | 54/200 [00:03<00:09, 15.75it/s]
 28%|β–ˆβ–ˆβ–Š       | 56/200 [00:03<00:09, 15.75it/s]
 29%|β–ˆβ–ˆβ–‰       | 58/200 [00:03<00:09, 15.75it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 60/200 [00:03<00:08, 15.75it/s]
 31%|β–ˆβ–ˆβ–ˆ       | 62/200 [00:03<00:08, 15.76it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 64/200 [00:04<00:08, 15.79it/s]
 33%|β–ˆβ–ˆβ–ˆβ–Ž      | 66/200 [00:04<00:08, 15.82it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 68/200 [00:04<00:08, 15.80it/s]
 35%|β–ˆβ–ˆβ–ˆβ–Œ      | 70/200 [00:04<00:08, 15.74it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 72/200 [00:04<00:08, 15.75it/s]
 37%|β–ˆβ–ˆβ–ˆβ–‹      | 74/200 [00:04<00:07, 15.77it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 76/200 [00:04<00:07, 15.78it/s]
 39%|β–ˆβ–ˆβ–ˆβ–‰      | 78/200 [00:04<00:07, 15.78it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 80/200 [00:05<00:07, 15.75it/s]
 41%|β–ˆβ–ˆβ–ˆβ–ˆ      | 82/200 [00:05<00:07, 15.74it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 84/200 [00:05<00:07, 15.78it/s]
 43%|β–ˆβ–ˆβ–ˆβ–ˆβ–Ž     | 86/200 [00:05<00:07, 15.77it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 88/200 [00:05<00:07, 15.78it/s]
 45%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 90/200 [00:05<00:06, 15.78it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 92/200 [00:05<00:06, 15.80it/s]
 47%|β–ˆβ–ˆβ–ˆβ–ˆβ–‹     | 94/200 [00:05<00:06, 15.80it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 96/200 [00:06<00:06, 15.82it/s]
 49%|β–ˆβ–ˆβ–ˆβ–ˆβ–‰     | 98/200 [00:06<00:06, 15.81it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 100/200 [00:06<00:06, 15.82it/s]
 51%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 102/200 [00:06<00:06, 15.79it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 104/200 [00:06<00:06, 15.80it/s]
 53%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž    | 106/200 [00:06<00:05, 15.73it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 108/200 [00:06<00:05, 15.73it/s]
 55%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 110/200 [00:07<00:05, 15.75it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 112/200 [00:07<00:05, 15.78it/s]
 57%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹    | 114/200 [00:07<00:05, 15.78it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 116/200 [00:07<00:05, 15.78it/s]
 59%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰    | 118/200 [00:07<00:05, 15.76it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 120/200 [00:07<00:05, 15.78it/s]
 61%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 122/200 [00:07<00:04, 15.79it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 124/200 [00:07<00:04, 15.80it/s]
 63%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž   | 126/200 [00:08<00:04, 15.82it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 128/200 [00:08<00:04, 15.81it/s]
 65%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 130/200 [00:08<00:04, 15.83it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 132/200 [00:08<00:04, 15.83it/s]
 67%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹   | 134/200 [00:08<00:04, 15.80it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 136/200 [00:08<00:04, 15.79it/s]
 69%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰   | 138/200 [00:08<00:03, 15.79it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 140/200 [00:08<00:03, 15.79it/s]
 71%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 142/200 [00:09<00:03, 15.80it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 144/200 [00:09<00:03, 15.80it/s]
 73%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  | 146/200 [00:09<00:03, 15.80it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 148/200 [00:09<00:03, 15.81it/s]
 75%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 150/200 [00:09<00:03, 15.79it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 152/200 [00:09<00:03, 15.81it/s]
 77%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹  | 154/200 [00:09<00:02, 15.80it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 156/200 [00:09<00:02, 15.77it/s]
 79%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  | 158/200 [00:10<00:02, 15.78it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 160/200 [00:10<00:02, 15.77it/s]
 81%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 162/200 [00:10<00:02, 15.79it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 164/200 [00:10<00:02, 15.77it/s]
 83%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž | 166/200 [00:10<00:02, 15.75it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 168/200 [00:10<00:02, 15.78it/s]
 85%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 170/200 [00:10<00:01, 15.80it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 172/200 [00:10<00:01, 15.80it/s]
 87%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹ | 174/200 [00:11<00:01, 15.81it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 176/200 [00:11<00:01, 15.81it/s]
 89%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ | 178/200 [00:11<00:01, 15.82it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 180/200 [00:11<00:01, 15.81it/s]
 91%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 182/200 [00:11<00:01, 15.78it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 184/200 [00:11<00:01, 15.79it/s]
 93%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž| 186/200 [00:11<00:00, 15.80it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 188/200 [00:11<00:00, 15.75it/s]
 95%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 190/200 [00:12<00:00, 15.47it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 192/200 [00:12<00:00, 15.54it/s]
 97%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‹| 194/200 [00:12<00:00, 15.56it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 196/200 [00:12<00:00, 15.57it/s]
 99%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰| 198/200 [00:12<00:00, 15.57it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 200/200 [00:12<00:00, 15.60it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 200/200 [00:12<00:00, 15.72it/s]

We can plot the loss to make sure that it decreases

plt.figure()
plt.semilogy(range(n_iter), losses)
plt.title("Loss evolution")
plt.xlabel("Iteration")
plt.tight_layout()
plt.show()
Loss evolution

Optimizing the physics as a usual neural network#

Below we show another way to optimize the parameter of the physics, as we usually do for neural networks

kernel_init = torch.zeros_like(true_kernel)
kernel_init[..., 5:-5, 5:-5] = 1.0
kernel_init = projection_simplex_sort(kernel_init)

# The gradient is off by default, we need to enable the gradient of the parameter
physics = dinv.physics.Blur(
    filter=kernel_init.clone().requires_grad_(True), device=device
)

# Set up the optimizer by giving the parameter to an optimizer
# Try to change your favorite optimizer
optimizer = torch.optim.AdamW([physics.filter], lr=0.1)


# Try to change another loss function
# loss_fn = torch.nn.MSELoss()
loss_fn = torch.nn.L1Loss()

# We will alternate a gradient step and a projection step
losses = []
n_iter = 100
for i in tqdm(range(n_iter)):
    # update the gradient
    optimizer.zero_grad()
    y_hat = physics.A(x)
    loss = loss_fn(y_hat, y)
    loss.backward()

    # a gradient step
    optimizer.step()

    # projection step.
    # Note: when doing additional steps, it's important to change only
    # the tensor data to avoid breaking the gradient computation
    physics.filter.data = projection_simplex_sort(physics.filter.data)

    # loss
    losses.append(loss.item())

kernel_hat = physics.filter.data
dinv.utils.plot(
    [true_kernel, kernel_init, kernel_hat],
    titles=["True kernel", "Init. kernel", "Estimated kernel"],
    suptitle="Result with AdamW and L1 Loss",
)
Result with AdamW and L1 Loss, True kernel, Init. kernel, Estimated kernel
  0%|          | 0/100 [00:00<?, ?it/s]
  2%|▏         | 2/100 [00:00<00:06, 15.12it/s]
  4%|▍         | 4/100 [00:00<00:06, 15.17it/s]
  6%|β–Œ         | 6/100 [00:00<00:06, 15.35it/s]
  8%|β–Š         | 8/100 [00:00<00:05, 15.42it/s]
 10%|β–ˆ         | 10/100 [00:00<00:05, 15.48it/s]
 12%|β–ˆβ–        | 12/100 [00:00<00:05, 15.56it/s]
 14%|β–ˆβ–        | 14/100 [00:00<00:05, 15.59it/s]
 16%|β–ˆβ–Œ        | 16/100 [00:01<00:05, 15.61it/s]
 18%|β–ˆβ–Š        | 18/100 [00:01<00:05, 15.63it/s]
 20%|β–ˆβ–ˆ        | 20/100 [00:01<00:05, 15.66it/s]
 22%|β–ˆβ–ˆβ–       | 22/100 [00:01<00:04, 15.69it/s]
 24%|β–ˆβ–ˆβ–       | 24/100 [00:01<00:04, 15.69it/s]
 26%|β–ˆβ–ˆβ–Œ       | 26/100 [00:01<00:04, 15.70it/s]
 28%|β–ˆβ–ˆβ–Š       | 28/100 [00:01<00:04, 15.71it/s]
 30%|β–ˆβ–ˆβ–ˆ       | 30/100 [00:01<00:04, 15.73it/s]
 32%|β–ˆβ–ˆβ–ˆβ–      | 32/100 [00:02<00:04, 15.75it/s]
 34%|β–ˆβ–ˆβ–ˆβ–      | 34/100 [00:02<00:04, 15.74it/s]
 36%|β–ˆβ–ˆβ–ˆβ–Œ      | 36/100 [00:02<00:04, 15.74it/s]
 38%|β–ˆβ–ˆβ–ˆβ–Š      | 38/100 [00:02<00:03, 15.76it/s]
 40%|β–ˆβ–ˆβ–ˆβ–ˆ      | 40/100 [00:02<00:03, 15.74it/s]
 42%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 42/100 [00:02<00:03, 15.72it/s]
 44%|β–ˆβ–ˆβ–ˆβ–ˆβ–     | 44/100 [00:02<00:03, 15.72it/s]
 46%|β–ˆβ–ˆβ–ˆβ–ˆβ–Œ     | 46/100 [00:02<00:03, 15.75it/s]
 48%|β–ˆβ–ˆβ–ˆβ–ˆβ–Š     | 48/100 [00:03<00:03, 15.77it/s]
 50%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ     | 50/100 [00:03<00:03, 15.75it/s]
 52%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 52/100 [00:03<00:03, 15.70it/s]
 54%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–    | 54/100 [00:03<00:02, 15.69it/s]
 56%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ    | 56/100 [00:03<00:02, 15.67it/s]
 58%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    | 58/100 [00:03<00:02, 15.70it/s]
 60%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    | 60/100 [00:03<00:02, 15.71it/s]
 62%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 62/100 [00:03<00:02, 15.67it/s]
 64%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–   | 64/100 [00:04<00:02, 15.68it/s]
 66%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ   | 66/100 [00:04<00:02, 15.70it/s]
 68%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š   | 68/100 [00:04<00:02, 15.71it/s]
 70%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   | 70/100 [00:04<00:01, 15.72it/s]
 72%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 72/100 [00:04<00:01, 15.69it/s]
 74%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  | 74/100 [00:04<00:01, 15.72it/s]
 76%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ  | 76/100 [00:04<00:01, 15.74it/s]
 78%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  | 78/100 [00:04<00:01, 15.77it/s]
 80%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  | 80/100 [00:05<00:01, 15.80it/s]
 82%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 82/100 [00:05<00:01, 15.81it/s]
 84%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– | 84/100 [00:05<00:01, 15.82it/s]
 86%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ | 86/100 [00:05<00:00, 15.83it/s]
 88%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š | 88/100 [00:05<00:00, 15.79it/s]
 90%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ | 90/100 [00:05<00:00, 15.77it/s]
 92%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 92/100 [00:05<00:00, 15.66it/s]
 94%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–| 94/100 [00:05<00:00, 15.66it/s]
 96%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ| 96/100 [00:06<00:00, 15.68it/s]
 98%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š| 98/100 [00:06<00:00, 15.72it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 100/100 [00:06<00:00, 15.75it/s]
100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 100/100 [00:06<00:00, 15.69it/s]

We can plot the loss to make sure that it decreases

plt.figure()
plt.semilogy(range(n_iter), losses)
plt.title("Loss evolution")
plt.xlabel("Iteration")
plt.tight_layout()
plt.show()
Loss evolution

Total running time of the script: (1 minutes 23.709 seconds)

Gallery generated by Sphinx-Gallery