Efficient online eye tracking with a lightweight spatiotemporal network and event cameras

1. Introduction

Event cameras are biologically inspired sensors that output asynchronous streams of per-pixel brightness changes, rather than fixed-rate frames. This modality is especially well suited for high-speed, low-power applications like real-time eye tracking on embedded hardware. Traditional deep learning models, however, are often ill-suited for exploiting the unique characteristics of event data — particularly they lack the tools to leverage their temporal precision and sparsity.

This tutorial presents a lightweight spatiotemporal neural network architecture designed specifically for online inference on event camera data. The model is:

  • Causal and streaming-capable, using FIFO buffering for minimal-latency inference.

  • Highly efficient, with a small compute and memory footprint.

  • Accurate, achieving state-of-the-art results on a competitive eye tracking benchmark.

  • Further optimizable via activation sparsification, maintaining performance while reducing computational load.

The following sections outline the architecture, dataset characteristics, evaluation results, buffering mechanism, and advanced optimization strategies.

2. Network architecture

The proposed architecture is a stack of spatiotemporal convolutional blocks, each consisting of a temporal convolution followed by a spatial convolution. These are designed to extract both fine-grained temporal features and local spatial structure from event-based input tensors. The figure below shows the details of the model architecture.

Model architecture overview

2.1 Key design features

  1. Causal Temporal Convolutions

    Temporal convolutions are strictly causal—output at time t depends only on input at time ≤ t. This property is critical for real-time, online inference, allowing inference from the first received frame from the sensor.

  2. Factorized 3D Convolution Scheme

    Our spatiotemporal blocks perform temporal convolutions first, followed by spatial convolutions. Decomposing the 3D convolutions into temporal and spatial layers greatly reduces computation (in much the same way that depthwise separable layers do for 2D convolutions).

    Factorization of conv3D into temporal and spatial convolutions
  3. Depthwise-Separable Convolutions (DWS)

    Both temporal and spatial layers can optionally be configured as depthwise-separable to further reduce computation with minimal loss in accuracy.

  4. No Residual Connections

    To conserve memory and simplify deployment on edge devices, residual connections are omitted. Since the model has a reduced number of layers, they are not critical to achieve SOTA performance.

  5. Detection Head

    A lightweight head, inspired by CenterNet Zhou et al. 2019, predicts a confidence score and local spatial offsets for the pupil position over a coarse spatial grid. The predicted position of the pupil can then be reconstructed.

    Centernet head and post processing

2.2 Instantiating the spatiotemporal blocks

QuantizeML and Akida Models natively work with Tensorflow/Keras layers: akida_models has all the necessary functions to instantiate a network based on spatiotemporal layers as well as training pipelines available to train models on the jester dataset, the dvs128 dataset or this dataset.

In this tutorial, we’ll use PyTorch and introduce the tenns_modules package which is available to create Akida compatible spatiotemporal blocks. The package contains a spatio-temporal block composed of a spatial and a temporal block.

The code below shows how to instantiate the simple 10 layers architecture we used to track the pupil coordinates in time using the tenns_modules package.

# Show how to load and create the model
import torch
import torch.nn as nn

from tenns_modules import SpatioTemporalBlock
from torchinfo import summary

n_depthwise_layers = 4
channels = [2, 8, 16, 32, 48, 64, 80, 96, 112, 128, 256]
t_kernel_size = 5  # can vary from 1 to 10
s_kernel_size = 3  # can vary in [1, 3, 5, 7] (1 only when depthwise is False)


class TennSt(nn.Module):
    def __init__(self, channels, t_kernel_size, s_kernel_size, n_depthwise_layers):
        super().__init__()

        depthwises = [False] * (10 - n_depthwise_layers) + [True] * n_depthwise_layers
        self.backbone = nn.Sequential()
        for i in range(0, len(depthwises), 2):
            in_channels, med_channels, out_channels = channels[i], channels[i + 1], channels[i + 2]
            t_depthwise, s_depthwise = depthwises[i], depthwises[i]

            self.backbone.append(
                SpatioTemporalBlock(in_channels=in_channels, med_channels=med_channels,
                                    out_channels=out_channels, t_kernel_size=t_kernel_size,
                                    s_kernel_size=s_kernel_size, s_stride=2, bias=False,
                                    t_depthwise=t_depthwise, s_depthwise=s_depthwise))

        self.head = nn.Sequential(
            SpatioTemporalBlock(channels[-1], channels[-1], channels[-1],
                                t_kernel_size=t_kernel_size, s_kernel_size=s_kernel_size,
                                t_depthwise=False, s_depthwise=False),
            nn.Conv3d(channels[-1], 3, 1)
        )

    def forward(self, input):
        return self.head((self.backbone(input)))


model = TennSt(channels, t_kernel_size, s_kernel_size, n_depthwise_layers)
summary(model, input_size=(1, 2, 50, 96, 128), depth=4, verbose=0)
====================================================================================================
Layer (type:depth-idx)                             Output Shape              Param #
====================================================================================================
TennSt                                             [1, 3, 50, 3, 4]          --
├─Sequential: 1-1                                  [1, 256, 50, 3, 4]        --
│    └─SpatioTemporalBlock: 2-1                    [1, 16, 50, 48, 64]       --
│    │    └─Sequential: 3-1                        [1, 16, 50, 48, 64]       --
│    │    │    └─TemporalBlock: 4-1                [1, 8, 50, 96, 128]       96
│    │    │    └─SpatialBlock: 4-2                 [1, 16, 50, 48, 64]       1,184
│    └─SpatioTemporalBlock: 2-2                    [1, 48, 50, 24, 32]       --
│    │    └─Sequential: 3-2                        [1, 48, 50, 24, 32]       --
│    │    │    └─TemporalBlock: 4-3                [1, 32, 50, 48, 64]       2,624
│    │    │    └─SpatialBlock: 4-4                 [1, 48, 50, 24, 32]       13,920
│    └─SpatioTemporalBlock: 2-3                    [1, 80, 50, 12, 16]       --
│    │    └─Sequential: 3-3                        [1, 80, 50, 12, 16]       --
│    │    │    └─TemporalBlock: 4-5                [1, 64, 50, 24, 32]       15,488
│    │    │    └─SpatialBlock: 4-6                 [1, 80, 50, 12, 16]       46,240
│    └─SpatioTemporalBlock: 2-4                    [1, 112, 50, 6, 8]        --
│    │    └─Sequential: 3-4                        [1, 112, 50, 6, 8]        --
│    │    │    └─TemporalBlock: 4-7                [1, 96, 50, 12, 16]       8,432
│    │    │    └─SpatialBlock: 4-8                 [1, 112, 50, 6, 8]        12,032
│    └─SpatioTemporalBlock: 2-5                    [1, 256, 50, 3, 4]        --
│    │    └─Sequential: 3-5                        [1, 256, 50, 3, 4]        --
│    │    │    └─TemporalBlock: 4-9                [1, 128, 50, 6, 8]        15,376
│    │    │    └─SpatialBlock: 4-10                [1, 256, 50, 3, 4]        34,688
├─Sequential: 1-2                                  [1, 3, 50, 3, 4]          --
│    └─SpatioTemporalBlock: 2-6                    [1, 256, 50, 3, 4]        --
│    │    └─Sequential: 3-6                        [1, 256, 50, 3, 4]        --
│    │    │    └─TemporalBlock: 4-11               [1, 256, 50, 3, 4]        328,448
│    │    │    └─SpatialBlock: 4-12                [1, 256, 50, 3, 4]        590,592
│    └─Conv3d: 2-7                                 [1, 3, 50, 3, 4]          771
====================================================================================================
Total params: 1,069,891
Trainable params: 1,069,891
Non-trainable params: 0
Total mult-adds (Units.GIGABYTES): 2.90
====================================================================================================
Input size (MB): 4.92
Forward/backward pass size (MB): 330.56
Params size (MB): 4.28
Estimated Total Size (MB): 339.76
====================================================================================================

3. Dataset and preprocessing

The model is trained and evaluated on the AIS 2024 Event-Based Eye Tracking Challenge Dataset, which contains recordings from 13 participants, captured using 480×640-resolution event camera. Each participant has between 2 and 6 recording sessions. The ground truth pupil (x- and y-) coordinates are provided at a resolution of 100Hz. The evaluation of the predictions is done at 20Hz at a resolution of 60x80 when the eyes are opened.

The video below shows you an example of the reconstructed frames (note that the video has been sped up). The ground truth pupil location is represented by a cross: the cross is green when the eye is opened and it turns red when the eye closes.

3.1 Preprocessing

The following preprocessing is applied to the event data:

  • temporal augmentations (for training only)

  • spatial downsampling (by 5) and event binning to create segments with fixed temporal length

  • spatial affine transforms

  • frames where the eye is labeled as closed are ignored during training

3.1.1 Event binning

Events are represented as 4-tuples: (polarity, x, y, timestamp). These are converted into tensors of shape (P=2, T, H, W) using causal event volume binning, a method that preserves temporal fidelity while avoiding future context. Binning uses a causal triangle kernel to approximate each event’s influence over space and time, as you can see from the graph below.

Example of causal event binning

3.1.2 Augmentation

To improve generalization in a data-limited regime, the following transforms are applied to the events (and the corresponding pupil coordinates) during training only:

  • Spatial affine transforms are applied such as scaling, rotation, translation.

  • Temporal augmentations including random time scaling and flipping (with polarity inversion).

  • Random temporal flip with probability 0.5 is applied to the time and polarity dimension.

These transforms are applied to each segment independently (but not varied within a segment). For better legibility, the dataset was preprocessed offline and made available for evaluation purposes only.

3.2 Evaluation metric

For the competition, the primary metric for model evaluation was the “p10” accuracy: the percentage of predictions falling within 10 pixels of the ground truth (i.e. if the predicted pupil center falls within the blue dashed circle in the figure below). We can also consider more stringent measures, such as a p3 accuracy (3 pixels); or simpler linear measures, such as the Euclidean distance (L2).

Metrics used in the competition

4. Model training & evaluation

4.1 Training details

The following hyperparameters were used for training:

  • batch size of 32

  • 50 event frames per segment

  • 200 epochs

  • AdamW optimizer with base LR of 0.002 and weight decay of 0.005

  • learning rate scheduler with linear warm up (for 2.5% of total epochs) and a cosine decay

Note

We don’t train the model here as it requires access to a GPU but rather load a pre-trained model for convenience.

# Load the pretrained weights in our model
from akida_models import fetch_file

ckpt_file = fetch_file(
    fname="tenn_spatiotemporal_eye.ckpt",
    origin="https://data.brainchip.com/models/AkidaV2/tenn_spatiotemporal/tenn_spatiotemporal_eye.ckpt",
    cache_subdir='models')

checkpoint = torch.load(ckpt_file, map_location="cpu")
new_state_dict = {k.replace('model._orig_mod.', ''): v for k, v in checkpoint["state_dict"].items()}
model.load_state_dict(new_state_dict)
_ = model.eval().cpu()
Downloading data from https://data.brainchip.com/models/AkidaV2/tenn_spatiotemporal/tenn_spatiotemporal_eye.ckpt.

       0/12939568 [..............................] - ETA: 0s
  212992/12939568 [..............................] - ETA: 3s
 1089536/12939568 [=>............................] - ETA: 1s
 2097152/12939568 [===>..........................] - ETA: 0s
 3227648/12939568 [======>.......................] - ETA: 0s
 4374528/12939568 [=========>....................] - ETA: 0s
 5554176/12939568 [===========>..................] - ETA: 0s
 6692864/12939568 [==============>...............] - ETA: 0s
 7897088/12939568 [=================>............] - ETA: 0s
 9019392/12939568 [===================>..........] - ETA: 0s
10166272/12939568 [======================>.......] - ETA: 0s
11362304/12939568 [=========================>....] - ETA: 0s
12550144/12939568 [============================>.] - ETA: 0s
12939568/12939568 [==============================] - 1s 0us/step
Download complete.

4.2 Evaluation

The preprocessed test data have been set aside and can be loaded from the archive available online.

Note

To optimize storage and reduce processing time, only the first 400 frames from each test file have been mirrored on the dataset server. This subset is representative and sufficient for evaluation purposes in this tutorial.

import numpy as np

samples = fetch_file("https://data.brainchip.com/dataset-mirror/eye_tracking_ais2024_cvpr/eye_tracking_preprocessed_400frames_test.npz",
                     fname="eye_tracking_preprocessed_400frames_test.npz")
data = np.load(samples, allow_pickle=True)
events, centers = data["events"], data["centers"]
Downloading data from https://data.brainchip.com/dataset-mirror/eye_tracking_ais2024_cvpr/eye_tracking_preprocessed_400frames_test.npz.

       0/57049038 [..............................] - ETA: 0s
  237568/57049038 [..............................] - ETA: 12s
  983040/57049038 [..............................] - ETA: 5s 
 1966080/57049038 [>.............................] - ETA: 4s
 2981888/57049038 [>.............................] - ETA: 3s
 3981312/57049038 [=>............................] - ETA: 3s
 4849664/57049038 [=>............................] - ETA: 3s
 5750784/57049038 [==>...........................] - ETA: 3s
 6832128/57049038 [==>...........................] - ETA: 2s
 7913472/57049038 [===>..........................] - ETA: 2s
 9109504/57049038 [===>..........................] - ETA: 2s
10305536/57049038 [====>.........................] - ETA: 2s
11501568/57049038 [=====>........................] - ETA: 2s
12648448/57049038 [=====>........................] - ETA: 2s
13860864/57049038 [======>.......................] - ETA: 2s
15024128/57049038 [======>.......................] - ETA: 2s
16203776/57049038 [=======>......................] - ETA: 2s
17383424/57049038 [========>.....................] - ETA: 1s
18530304/57049038 [========>.....................] - ETA: 1s
19726336/57049038 [=========>....................] - ETA: 1s
20840448/57049038 [=========>....................] - ETA: 1s
22052864/57049038 [==========>...................] - ETA: 1s
23199744/57049038 [===========>..................] - ETA: 1s
24346624/57049038 [===========>..................] - ETA: 1s
25559040/57049038 [============>.................] - ETA: 1s
26763264/57049038 [=============>................] - ETA: 1s
27951104/57049038 [=============>................] - ETA: 1s
29130752/57049038 [==============>...............] - ETA: 1s
30294016/57049038 [==============>...............] - ETA: 1s
31440896/57049038 [===============>..............] - ETA: 1s
32669696/57049038 [================>.............] - ETA: 1s
33865728/57049038 [================>.............] - ETA: 1s
35045376/57049038 [=================>............] - ETA: 1s
36274176/57049038 [==================>...........] - ETA: 0s
37421056/57049038 [==================>...........] - ETA: 0s
38649856/57049038 [===================>..........] - ETA: 0s
39845888/57049038 [===================>..........] - ETA: 0s
41041920/57049038 [====================>.........] - ETA: 0s
42221568/57049038 [=====================>........] - ETA: 0s
43450368/57049038 [=====================>........] - ETA: 0s
44597248/57049038 [======================>.......] - ETA: 0s
45858816/57049038 [=======================>......] - ETA: 0s
46989312/57049038 [=======================>......] - ETA: 0s
48234496/57049038 [========================>.....] - ETA: 0s
49397760/57049038 [========================>.....] - ETA: 0s
50642944/57049038 [=========================>....] - ETA: 0s
51838976/57049038 [==========================>...] - ETA: 0s
53002240/57049038 [==========================>...] - ETA: 0s
54231040/57049038 [===========================>..] - ETA: 0s
55369728/57049038 [============================>.] - ETA: 0s
56819712/57049038 [============================>.] - ETA: 0s
57049038/57049038 [==============================] - 3s 0us/step
Download complete.

To evaluate the model, we pass the data through our spatiotemporal model. Once we have the output, we need to post process the model’s output to reconstruct the predicted pupil coordinates in the prediction space (60, 80).

def process_detector_prediction(pred):
    """Post-processing of model predictions to extract the predicted pupil coordinates for a model
    that has a centernet like head.

    Args:
        preds (torch.Tensor): shape (B, C, T, H, W)

    Returns:
        torch tensor of (B, 2) containing the x and y predicted coordinates
    """
    torch_device = pred.device
    batch_size, _, frames, height, width = pred.shape
    # Extract the center heatmap, and the x and y offset maps
    pred_pupil, pred_x_mod, pred_y_mod = pred.moveaxis(1, 0)
    pred_x_mod = torch.sigmoid(pred_x_mod)
    pred_y_mod = torch.sigmoid(pred_y_mod)

    # Find the stronger peak in the center heatmap and it's coordinates
    pupil_ind = pred_pupil.flatten(-2, -1).argmax(-1)  # (batch, frames)
    pupil_ind_x = pupil_ind % width
    pupil_ind_y = pupil_ind // width

    # Reconstruct the predicted offset
    batch_range = torch.arange(batch_size, device=torch_device).repeat_interleave(frames)
    frames_range = torch.arange(frames, device=torch_device).repeat(batch_size)
    pred_x_mod = pred_x_mod[batch_range, frames_range, pupil_ind_y.flatten(), pupil_ind_x.flatten()]
    pred_y_mod = pred_y_mod[batch_range, frames_range, pupil_ind_y.flatten(), pupil_ind_x.flatten()]

    # Express the coordinates in size agnostic terms (between 0 and 1)
    x = (pupil_ind_x + pred_x_mod.view(batch_size, frames)) / width
    y = (pupil_ind_y + pred_y_mod.view(batch_size, frames)) / height
    return torch.stack([x, y], dim=1)


def compute_distance(pred, center):
    """Computes the L2 distance for a prediction and center matrice

    Args:
        pred: torch tensor of shape (2, T)
        center: torch tensor of shape (2, T)
    """
    height, width = 60, 80
    pred = pred.detach().clone()
    center = center.detach().clone()
    pred[0, :] *= width
    pred[1, :] *= height
    center[0, :] *= width
    center[1, :] *= height
    l2_distances = torch.norm(center - pred, dim=0)
    return l2_distances


def pretty_print_results(collected_distances):
    """Prints the distance and accuracy within different pixel tolerance.

    By default, only the results at 20Hz will be printed (to be compatible with the
    metrics of the challenge). To print the results computed on the whole trial,
    use downsample=False. In practice, this changes very little to the final performance
    of the model.
    """
    for t in [10, 5, 3, 1]:
        p_acc = (collected_distances < t).sum() / collected_distances.size
        print(f'- p{t}: {p_acc:.3f}')
    print(f'- Euc. Dist: {collected_distances.mean():.3f} ')
# Get the model device to propagate the events properly
torch_device = next(model.parameters()).device

# Compute the distances across all 9 trials
collected_l2_distances = np.zeros((0,))
for trial_idx, event in enumerate(events):
    center = torch.from_numpy(centers[trial_idx]).float().to(torch_device)
    event = torch.from_numpy(event).unsqueeze(0).float().to(torch_device)
    pred = model(event)
    pred = process_detector_prediction(pred).squeeze(0)
    l2_distances = compute_distance(pred, center)
    collected_l2_distances = np.concatenate((collected_l2_distances, l2_distances), axis=0)

pretty_print_results(collected_l2_distances)
- p10: 0.991
- p5: 0.979
- p3: 0.931
- p1: 0.362
- Euc. Dist: 1.601

5. Official competition results

The results for the competition are on the test set (labels are not available). The main metric in the challenge was the p10. Using this metric, our model ranked 3rd (see table below copied from the original challenge survey paper).

However, other metrics were reported in the original challenge survey: the accuracy within 5 (p5), 3 (p3) or 1 pixel (p1), as well as metrics directly measuring the distance between ground truth and predicted pupil location (L2 and L1, i.e. smaller values are better). On these more stringent metrics, our model outperforms the other models on all the other metrics.

Team

Rank

p10 private (primary)

p10 🡑

p5 🡑

p3 🡑

p1 🡑

L2 🡓

L1 🡓

USTCEventGroup

1

99.58

99.42

97.05

90.73

33.75

1.67

2.11

FreeEvs

2

99.27

99.26

94.31

83.83

23.91

2.03

2.56

Brainchip

3

99.16

99.00

97.79

94.58

45.50

1.44

1.82

Go Sparse

4

98.74

99.00

77.20

47.97

7.32

3.51

4.63

MeMo

4

98.74

99.05

89.36

50.87

6.53

3.2

4.04

The best metric in class is highlighted in bold, 🡑 means higher values are best, 🡓 means lower values are best.

The code below shows an inference on the model using the test dataset. Note that the results below differ from the challenge metrics reported above because our submission model was trained on both the train and validation data to achieve the best possible performance (as allowed by the rules), but the model below that was used for the ablation studies was trained on the train set only.

6. Ablation studies and efficiency optimization

Figure reproduced from the original paper.

Figure 3 from the original paper

6.1 Ablation studies

To test the robustness of our design choices, we performed a series of ablation studies. To provide a baseline model for the ablation study, we trained a model on the ‘train’ split only and tested it on the validation dataset. This model gets a p10 of 0.963 and an l2 distance of 2.79.

This showed that:

  1. Removing spatial affine augmentation reduces performance dramatically (from 0.963 → 0.588).

  2. Causal event binning performs equivalently to other methods while enabling streaming inference.

  3. Larger temporal kernels (e.g., size 5 vs. 3) offer small but consistent improvements in accuracy.

  4. Using only batch normalization (BN) layers gave a small improvement over group norm (GN) only or a mix of BN/GN(96.9 vs 96.0 or 96.3).

For more details you can refer to the paper.

6.2 Efficiency-accuracy trade-offs

In certain environments, such as edge or low-power devices, the balance between model size and computational demand often matters more than achieving state-of-the-art accuracy. This section explores the trade-off between maximizing accuracy and maintaining model efficiency along 3 axis.

6.2.1 Spatial resolution

We looked at how reducing input image size affects model performance (see figure 3.A). Even with an input size of 60 x 80 (downsampling by a factor of 8), the model still performs almost as well as with our default setting (downsampling by a factor of 5), while requiring only a third of the computation.

6.2.2 Depthwise separable convolutions

From the outset, we decided to further decompose our factorized convolutions into depthwise and pointwise convolutions (similar to depthwise separable convolutions introduced in MobileNet V1). We explored how these impacted model performance (see figure 3.B): as the number of separable convolutions used increases, the MACs of the model decrease, with a relatively small impact on the validation distance. When no separable layers are used, the final validation distance is 2.6 vs. 3.1 when all layers are separable. Our baseline model had the last 4 layers configured as separable. Changing just 2 more to separable could lead to a reduction of almost 30% in compute, with almost no impact on performance (compare the turquoise with green lines on the figure 3.B).

The combination of these techniques results in a highly efficient model with a computational cost of just 55M MACs/frame, and even less when sparsity is exploited.

6.2.3 Activity regularization

Event camera data is inherently sparse. However, intermediate layers in a neural network may still produce dense activations unless explicitly regularized. When measuring the baseline sparsity in the network, we found it to be on average 50% (about what one would expect given ReLU activation functions), much of which may not be informative given the very high spatial sparsity of the input to the network. By applying L1 regularization to ReLU activations during training, the model is encouraged to silence unnecessary activations. We applied 5 different levels of regularization to our model: figure 3.C shows how the average distance varies depending on the regularization strength while figure 3.D shows how the sparse aware MACs (i.e. MACs multiplied by the model’s mean sparsity per layer) is affected by regularization. We can see that over 90% activation sparsity is achievable with a negligible performance degradation (p10 remains >0.96).

This is especially interesting because Akida is an event based hardware: it is capable of skipping zero operations. In such hardware, high level of activation sparsity can translate into ~5× speedups.

Warning

Based on these ablation studies, the model made available through the model zoo has been optimized for the inference on Akida Hardware (downsampling by a factor of 6, use of depthwise separable convolutions), so the number of parameters and accuracy reported differ.

7. FIFO buffering for streaming inference

7.1 Key mechanism

Each temporal convolutional layer maintains a fixed-length FIFO buffer of its input history (equal to the kernel size). At each time step:

  • The buffer is updated with the newest frame.

  • A dot product is computed between the buffer contents and the kernel weights.

  • The result is passed through normalization and spatial convolution.

This approach mimics the operation of a sliding temporal convolution but avoids recomputation and memory redundancy, ensuring minimal latency and efficient real-time processing. For more details of this approach, see the tutorial that introduced spatiotemporal models.

Fifo buffer

7.2 Exporting to ONNX

The transformation to buffer mode is done during quantization step (see dedicated section below). The first step is to export the model to ONNX format. This is made very easy using the tenns_modules package and the export_to_onnx function.

from tenns_modules import export_to_onnx

# Using a batch size of 10 to export with a dynamic batch size
onnx_checkpoint_path = "tenns_modules_onnx.onnx"
export_to_onnx(model, (10, 2, 50, 96, 128), out_path=onnx_checkpoint_path)
[torch.onnx] Obtain model graph for `TennSt([...]` with `torch.export.export(..., strict=False)`...
[torch.onnx] Obtain model graph for `TennSt([...]` with `torch.export.export(..., strict=False)`... ✅
[torch.onnx] Run decomposition...
[torch.onnx] Run decomposition... ✅
[torch.onnx] Translate the graph into ONNX...
[torch.onnx] Translate the graph into ONNX... ✅
Model exported to tenns_modules_onnx.onnx.

Load the ONNX model that was automatically saved

import onnx

model = onnx.load(onnx_checkpoint_path)

8. Quantization and conversion to Akida

8.1 Quantization

To be deployable on Akida, the model needs to be quantized. This can easily be done using the QuantizeML package. For more details on the quantization scheme with the ONNX package see this example on off-the-shelf model quantization.

from quantizeml.models import quantize
from quantizeml.layers import QuantizationParams

# Retrieve calibration samples:
samples = fetch_file("https://data.brainchip.com/dataset-mirror/samples/eye_tracking/eye_tracking_onnx_samples_bs100.npz",
                     fname="eye_tracking_onnx_samples_bs100.npz")

# Define quantization parameters and load quantization samples
qparams = QuantizationParams(per_tensor_activations=True, input_dtype='int8')
data = np.load(samples)
samples = np.concatenate([data[item] for item in data.files])

# Quantize the model
model_quant = quantize(model, qparams=qparams, epochs=1, batch_size=100, samples=samples)
Downloading data from https://data.brainchip.com/dataset-mirror/samples/eye_tracking/eye_tracking_onnx_samples_bs100.npz.

       0/44009403 [..............................] - ETA: 0s
  204800/44009403 [..............................] - ETA: 12s
  950272/44009403 [..............................] - ETA: 4s 
 1941504/44009403 [>.............................] - ETA: 3s
 2826240/44009403 [>.............................] - ETA: 3s
 3825664/44009403 [=>............................] - ETA: 2s
 4907008/44009403 [==>...........................] - ETA: 2s
 6053888/44009403 [===>..........................] - ETA: 2s
 7356416/44009403 [====>.........................] - ETA: 2s
 8536064/44009403 [====>.........................] - ETA: 1s
 9904128/44009403 [=====>........................] - ETA: 1s
11403264/44009403 [======>.......................] - ETA: 1s
12877824/44009403 [=======>......................] - ETA: 1s
14303232/44009403 [========>.....................] - ETA: 1s
15785984/44009403 [=========>....................] - ETA: 1s
17268736/44009403 [==========>...................] - ETA: 1s
18751488/44009403 [===========>..................] - ETA: 1s
20234240/44009403 [============>.................] - ETA: 1s
21364736/44009403 [=============>................] - ETA: 1s
23945216/44009403 [===============>..............] - ETA: 0s
25174016/44009403 [================>.............] - ETA: 0s
26353664/44009403 [================>.............] - ETA: 0s
27705344/44009403 [=================>............] - ETA: 0s
29171712/44009403 [==================>...........] - ETA: 0s
30408704/44009403 [===================>..........] - ETA: 0s
31514624/44009403 [====================>.........] - ETA: 0s
32972800/44009403 [=====================>........] - ETA: 0s
34250752/44009403 [======================>.......] - ETA: 0s
35364864/44009403 [=======================>......] - ETA: 0s
36839424/44009403 [========================>.....] - ETA: 0s
37953536/44009403 [========================>.....] - ETA: 0s
39247872/44009403 [=========================>....] - ETA: 0s
40706048/44009403 [==========================>...] - ETA: 0s
41820160/44009403 [===========================>..] - ETA: 0s
43196416/44009403 [============================>.] - ETA: 0s
44009403/44009403 [==============================] - 2s 0us/step
Download complete.
Applied 17 of general pattern rewrite rules.

Calibrating with 50/50.0 samples

Note

During this step, the model is also bufferized, meaning that the FIFOs of the temporal convolutions are automatically created and initialized from the 3D convolutions.

8.2 ONNX model evaluation

This model can be evaluated using the same process as before with a few differences:

  • We need to pass each frame to the model independently (i.e. the model now has a 4-D input shape (B, C, H, W) - batch, channels, height, width).

  • The post processing function needs to be modified to use numpy functions (instead of torch)

  • Once all frames from a given trial have been passed through, the FIFO buffers of the temporal convolutions need to be reset using the reset_buffers available from QuantizeML.

def custom_process_detector_prediction(pred):
    """ Post-processing of the model's output heatmap.

    Reconstructs the predicted x- and y- center location using numpy functions to post-process
    the output of a ONNX model.
    """
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    # Pred shape is (batch, channels, height, width)
    batch_size, _, height, width = pred.shape

    # Split channels - reshape to move frames dimension after batch
    # Now (batch, height, width, channels)
    pred = np.moveaxis(pred, 1, -1)
    pred_pupil = pred[..., 0]
    pred_x_mod = sigmoid(pred[..., 1])
    pred_y_mod = sigmoid(pred[..., 2])

    # Find pupil location
    pred_pupil_flat = pred_pupil.reshape(batch_size, -1)
    pupil_ind = np.argmax(pred_pupil_flat, axis=-1)
    pupil_ind_x = pupil_ind % width
    pupil_ind_y = pupil_ind // width

    # Get the learned x- y- offset
    batch_idx = np.repeat(np.arange(batch_size)[:, None], 1, axis=1)
    x_mods = pred_x_mod[batch_idx, pupil_ind_y, pupil_ind_x]
    y_mods = pred_y_mod[batch_idx, pupil_ind_y, pupil_ind_x]

    # Calculate final coordinates
    x = (pupil_ind_x + x_mods) / width
    y = (pupil_ind_y + y_mods) / height

    return np.stack([x, y], axis=1)

Create the inference session for the ONNX model and evaluate

from onnxruntime import InferenceSession, SessionOptions
from onnxruntime_extensions import get_library_path
from quantizeml.onnx_support.quantization import ONNXModel

sess_options = SessionOptions()
sess_options.register_custom_ops_library(get_library_path())
model_quant = ONNXModel(model_quant)
session = InferenceSession(model_quant.serialized, sess_options=sess_options,
                           providers=['CPUExecutionProvider'])
from quantizeml.onnx_support.layers.buffertempconv import reset_buffers
from tqdm import tqdm

# And then evaluate the model
collected_l2_distances = []
for trial_idx, event in enumerate(events):
    center = centers[trial_idx]
    for frame_idx in tqdm(range(event.shape[1])):
        frame = event[:, frame_idx, ...][None, ...].astype(np.float32)
        pred = session.run(None, {model_quant.input[0].name: frame})[0]
        pred = custom_process_detector_prediction(pred).squeeze()
        y_pred_x = pred[0] * 80
        y_pred_y = pred[1] * 60
        center_x = center[0, frame_idx] * 80
        center_y = center[1, frame_idx] * 60
        collected_l2_distances.append(np.sqrt(np.square(
            center_x - y_pred_x) + np.square(center_y - y_pred_y)))
    # Reset FIFOs between each file
    reset_buffers(model_quant)
  0%|          | 0/400 [00:00<?, ?it/s]
  0%|          | 2/400 [00:00<00:25, 15.84it/s]
  1%|▏         | 5/400 [00:00<00:20, 19.31it/s]
  2%|▏         | 8/400 [00:00<00:19, 20.39it/s]
  3%|▎         | 11/400 [00:00<00:18, 20.89it/s]
  4%|▎         | 14/400 [00:00<00:18, 21.16it/s]
  4%|▍         | 17/400 [00:00<00:17, 21.32it/s]
  5%|▌         | 20/400 [00:00<00:17, 21.42it/s]
  6%|▌         | 23/400 [00:01<00:17, 21.45it/s]
  6%|▋         | 26/400 [00:01<00:17, 21.51it/s]
  7%|▋         | 29/400 [00:01<00:17, 21.54it/s]
  8%|▊         | 32/400 [00:01<00:17, 21.55it/s]
  9%|▉         | 35/400 [00:01<00:16, 21.56it/s]
 10%|▉         | 38/400 [00:01<00:16, 21.58it/s]
 10%|█         | 41/400 [00:01<00:16, 21.58it/s]
 11%|█         | 44/400 [00:02<00:16, 21.57it/s]
 12%|█▏        | 47/400 [00:02<00:16, 21.56it/s]
 12%|█▎        | 50/400 [00:02<00:16, 21.56it/s]
 13%|█▎        | 53/400 [00:02<00:16, 21.57it/s]
 14%|█▍        | 56/400 [00:02<00:15, 21.57it/s]
 15%|█▍        | 59/400 [00:02<00:15, 21.57it/s]
 16%|█▌        | 62/400 [00:02<00:15, 21.55it/s]
 16%|█▋        | 65/400 [00:03<00:15, 21.52it/s]
 17%|█▋        | 68/400 [00:03<00:15, 21.49it/s]
 18%|█▊        | 71/400 [00:03<00:15, 21.49it/s]
 18%|█▊        | 74/400 [00:03<00:15, 21.50it/s]
 19%|█▉        | 77/400 [00:03<00:15, 21.51it/s]
 20%|██        | 80/400 [00:03<00:14, 21.51it/s]
 21%|██        | 83/400 [00:03<00:14, 21.50it/s]
 22%|██▏       | 86/400 [00:04<00:14, 21.49it/s]
 22%|██▏       | 89/400 [00:04<00:14, 21.48it/s]
 23%|██▎       | 92/400 [00:04<00:14, 21.47it/s]
 24%|██▍       | 95/400 [00:04<00:14, 21.48it/s]
 24%|██▍       | 98/400 [00:04<00:14, 21.49it/s]
 25%|██▌       | 101/400 [00:04<00:13, 21.49it/s]
 26%|██▌       | 104/400 [00:04<00:13, 21.50it/s]
 27%|██▋       | 107/400 [00:05<00:13, 21.49it/s]
 28%|██▊       | 110/400 [00:05<00:13, 21.48it/s]
 28%|██▊       | 113/400 [00:05<00:13, 21.48it/s]
 29%|██▉       | 116/400 [00:05<00:13, 21.47it/s]
 30%|██▉       | 119/400 [00:05<00:13, 21.46it/s]
 30%|███       | 122/400 [00:05<00:12, 21.45it/s]
 31%|███▏      | 125/400 [00:05<00:12, 21.46it/s]
 32%|███▏      | 128/400 [00:05<00:12, 21.49it/s]
 33%|███▎      | 131/400 [00:06<00:12, 21.48it/s]
 34%|███▎      | 134/400 [00:06<00:12, 21.50it/s]
 34%|███▍      | 137/400 [00:06<00:12, 21.52it/s]
 35%|███▌      | 140/400 [00:06<00:12, 21.52it/s]
 36%|███▌      | 143/400 [00:06<00:11, 21.53it/s]
 36%|███▋      | 146/400 [00:06<00:11, 21.54it/s]
 37%|███▋      | 149/400 [00:06<00:11, 21.53it/s]
 38%|███▊      | 152/400 [00:07<00:11, 21.52it/s]
 39%|███▉      | 155/400 [00:07<00:11, 21.50it/s]
 40%|███▉      | 158/400 [00:07<00:11, 21.50it/s]
 40%|████      | 161/400 [00:07<00:11, 21.50it/s]
 41%|████      | 164/400 [00:07<00:10, 21.50it/s]
 42%|████▏     | 167/400 [00:07<00:10, 21.51it/s]
 42%|████▎     | 170/400 [00:07<00:10, 21.51it/s]
 43%|████▎     | 173/400 [00:08<00:10, 21.51it/s]
 44%|████▍     | 176/400 [00:08<00:10, 21.50it/s]
 45%|████▍     | 179/400 [00:08<00:10, 21.48it/s]
 46%|████▌     | 182/400 [00:08<00:10, 21.48it/s]
 46%|████▋     | 185/400 [00:08<00:10, 21.47it/s]
 47%|████▋     | 188/400 [00:08<00:09, 21.46it/s]
 48%|████▊     | 191/400 [00:08<00:09, 21.47it/s]
 48%|████▊     | 194/400 [00:09<00:09, 21.47it/s]
 49%|████▉     | 197/400 [00:09<00:09, 21.46it/s]
 50%|█████     | 200/400 [00:09<00:09, 21.44it/s]
 51%|█████     | 203/400 [00:09<00:09, 21.44it/s]
 52%|█████▏    | 206/400 [00:09<00:09, 21.45it/s]
 52%|█████▏    | 209/400 [00:09<00:08, 21.45it/s]
 53%|█████▎    | 212/400 [00:09<00:08, 21.45it/s]
 54%|█████▍    | 215/400 [00:10<00:08, 21.46it/s]
 55%|█████▍    | 218/400 [00:10<00:08, 21.43it/s]
 55%|█████▌    | 221/400 [00:10<00:08, 21.43it/s]
 56%|█████▌    | 224/400 [00:10<00:08, 21.42it/s]
 57%|█████▋    | 227/400 [00:10<00:08, 21.40it/s]
 57%|█████▊    | 230/400 [00:10<00:07, 21.38it/s]
 58%|█████▊    | 233/400 [00:10<00:07, 21.37it/s]
 59%|█████▉    | 236/400 [00:11<00:07, 21.36it/s]
 60%|█████▉    | 239/400 [00:11<00:07, 21.32it/s]
 60%|██████    | 242/400 [00:11<00:07, 21.31it/s]
 61%|██████▏   | 245/400 [00:11<00:07, 21.31it/s]
 62%|██████▏   | 248/400 [00:11<00:07, 21.31it/s]
 63%|██████▎   | 251/400 [00:11<00:06, 21.31it/s]
 64%|██████▎   | 254/400 [00:11<00:06, 21.30it/s]
 64%|██████▍   | 257/400 [00:11<00:06, 21.31it/s]
 65%|██████▌   | 260/400 [00:12<00:06, 21.29it/s]
 66%|██████▌   | 263/400 [00:12<00:06, 21.29it/s]
 66%|██████▋   | 266/400 [00:12<00:06, 21.29it/s]
 67%|██████▋   | 269/400 [00:12<00:06, 21.29it/s]
 68%|██████▊   | 272/400 [00:12<00:06, 21.29it/s]
 69%|██████▉   | 275/400 [00:12<00:05, 21.29it/s]
 70%|██████▉   | 278/400 [00:12<00:05, 21.30it/s]
 70%|███████   | 281/400 [00:13<00:05, 21.29it/s]
 71%|███████   | 284/400 [00:13<00:05, 21.29it/s]
 72%|███████▏  | 287/400 [00:13<00:05, 21.29it/s]
 72%|███████▎  | 290/400 [00:13<00:05, 21.28it/s]
 73%|███████▎  | 293/400 [00:13<00:05, 21.28it/s]
 74%|███████▍  | 296/400 [00:13<00:04, 21.29it/s]
 75%|███████▍  | 299/400 [00:13<00:04, 21.28it/s]
 76%|███████▌  | 302/400 [00:14<00:04, 21.28it/s]
 76%|███████▋  | 305/400 [00:14<00:04, 21.26it/s]
 77%|███████▋  | 308/400 [00:14<00:04, 21.27it/s]
 78%|███████▊  | 311/400 [00:14<00:04, 21.25it/s]
 78%|███████▊  | 314/400 [00:14<00:04, 21.27it/s]
 79%|███████▉  | 317/400 [00:14<00:03, 21.30it/s]
 80%|████████  | 320/400 [00:14<00:03, 21.30it/s]
 81%|████████  | 323/400 [00:15<00:03, 21.30it/s]
 82%|████████▏ | 326/400 [00:15<00:03, 21.29it/s]
 82%|████████▏ | 329/400 [00:15<00:03, 21.30it/s]
 83%|████████▎ | 332/400 [00:15<00:03, 21.30it/s]
 84%|████████▍ | 335/400 [00:15<00:03, 21.31it/s]
 84%|████████▍ | 338/400 [00:15<00:02, 21.30it/s]
 85%|████████▌ | 341/400 [00:15<00:02, 21.30it/s]
 86%|████████▌ | 344/400 [00:16<00:02, 21.31it/s]
 87%|████████▋ | 347/400 [00:16<00:02, 21.29it/s]
 88%|████████▊ | 350/400 [00:16<00:02, 21.30it/s]
 88%|████████▊ | 353/400 [00:16<00:02, 21.31it/s]
 89%|████████▉ | 356/400 [00:16<00:02, 21.31it/s]
 90%|████████▉ | 359/400 [00:16<00:01, 21.31it/s]
 90%|█████████ | 362/400 [00:16<00:01, 21.31it/s]
 91%|█████████▏| 365/400 [00:17<00:01, 21.31it/s]
 92%|█████████▏| 368/400 [00:17<00:01, 21.27it/s]
 93%|█████████▎| 371/400 [00:17<00:01, 21.25it/s]
 94%|█████████▎| 374/400 [00:17<00:01, 21.24it/s]
 94%|█████████▍| 377/400 [00:17<00:01, 21.22it/s]
 95%|█████████▌| 380/400 [00:17<00:00, 21.23it/s]
 96%|█████████▌| 383/400 [00:17<00:00, 21.22it/s]
 96%|█████████▋| 386/400 [00:18<00:00, 21.21it/s]
 97%|█████████▋| 389/400 [00:18<00:00, 21.21it/s]
 98%|█████████▊| 392/400 [00:18<00:00, 21.21it/s]
 99%|█████████▉| 395/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 398/400 [00:18<00:00, 21.21it/s]
100%|██████████| 400/400 [00:18<00:00, 21.37it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.22it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.19it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.18it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.16it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.17it/s]
  4%|▍         | 18/400 [00:00<00:18, 21.17it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.17it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.17it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.17it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.17it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.15it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.17it/s]
 10%|▉         | 39/400 [00:01<00:17, 21.17it/s]
 10%|█         | 42/400 [00:01<00:16, 21.17it/s]
 11%|█▏        | 45/400 [00:02<00:16, 21.18it/s]
 12%|█▏        | 48/400 [00:02<00:16, 21.17it/s]
 13%|█▎        | 51/400 [00:02<00:16, 21.18it/s]
 14%|█▎        | 54/400 [00:02<00:16, 21.17it/s]
 14%|█▍        | 57/400 [00:02<00:16, 21.17it/s]
 15%|█▌        | 60/400 [00:02<00:16, 21.17it/s]
 16%|█▌        | 63/400 [00:02<00:15, 21.18it/s]
 16%|█▋        | 66/400 [00:03<00:15, 21.18it/s]
 17%|█▋        | 69/400 [00:03<00:15, 21.17it/s]
 18%|█▊        | 72/400 [00:03<00:15, 21.20it/s]
 19%|█▉        | 75/400 [00:03<00:15, 21.20it/s]
 20%|█▉        | 78/400 [00:03<00:15, 21.22it/s]
 20%|██        | 81/400 [00:03<00:15, 21.23it/s]
 21%|██        | 84/400 [00:03<00:14, 21.24it/s]
 22%|██▏       | 87/400 [00:04<00:14, 21.24it/s]
 22%|██▎       | 90/400 [00:04<00:14, 21.24it/s]
 23%|██▎       | 93/400 [00:04<00:14, 21.24it/s]
 24%|██▍       | 96/400 [00:04<00:14, 21.22it/s]
 25%|██▍       | 99/400 [00:04<00:14, 21.21it/s]
 26%|██▌       | 102/400 [00:04<00:14, 21.22it/s]
 26%|██▋       | 105/400 [00:04<00:13, 21.19it/s]
 27%|██▋       | 108/400 [00:05<00:13, 21.20it/s]
 28%|██▊       | 111/400 [00:05<00:13, 21.19it/s]
 28%|██▊       | 114/400 [00:05<00:13, 21.19it/s]
 29%|██▉       | 117/400 [00:05<00:13, 21.17it/s]
 30%|███       | 120/400 [00:05<00:13, 21.18it/s]
 31%|███       | 123/400 [00:05<00:13, 21.14it/s]
 32%|███▏      | 126/400 [00:05<00:12, 21.12it/s]
 32%|███▏      | 129/400 [00:06<00:12, 21.10it/s]
 33%|███▎      | 132/400 [00:06<00:12, 21.09it/s]
 34%|███▍      | 135/400 [00:06<00:12, 21.08it/s]
 34%|███▍      | 138/400 [00:06<00:12, 21.05it/s]
 35%|███▌      | 141/400 [00:06<00:12, 21.05it/s]
 36%|███▌      | 144/400 [00:06<00:12, 21.05it/s]
 37%|███▋      | 147/400 [00:06<00:12, 21.04it/s]
 38%|███▊      | 150/400 [00:07<00:11, 21.04it/s]
 38%|███▊      | 153/400 [00:07<00:11, 21.04it/s]
 39%|███▉      | 156/400 [00:07<00:11, 21.03it/s]
 40%|███▉      | 159/400 [00:07<00:11, 21.01it/s]
 40%|████      | 162/400 [00:07<00:11, 21.02it/s]
 41%|████▏     | 165/400 [00:07<00:11, 21.03it/s]
 42%|████▏     | 168/400 [00:07<00:11, 21.00it/s]
 43%|████▎     | 171/400 [00:08<00:10, 20.98it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.97it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.97it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.95it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.95it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.95it/s]
 47%|████▋     | 189/400 [00:08<00:10, 20.97it/s]
 48%|████▊     | 192/400 [00:09<00:09, 20.99it/s]
 49%|████▉     | 195/400 [00:09<00:09, 21.00it/s]
 50%|████▉     | 198/400 [00:09<00:09, 21.00it/s]
 50%|█████     | 201/400 [00:09<00:09, 21.01it/s]
 51%|█████     | 204/400 [00:09<00:09, 21.01it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 21.02it/s]
 52%|█████▎    | 210/400 [00:09<00:09, 21.03it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 21.04it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 21.04it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 21.04it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 21.02it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 21.03it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 21.02it/s]
 58%|█████▊    | 231/400 [00:10<00:08, 21.02it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 21.04it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 21.07it/s]
 60%|██████    | 240/400 [00:11<00:07, 21.11it/s]
 61%|██████    | 243/400 [00:11<00:07, 21.11it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 21.13it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 21.15it/s]
 63%|██████▎   | 252/400 [00:11<00:06, 21.17it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 21.18it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 21.19it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 21.19it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 21.17it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 21.18it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 21.19it/s]
 68%|██████▊   | 273/400 [00:12<00:05, 21.18it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 21.19it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 21.19it/s]
 70%|███████   | 282/400 [00:13<00:05, 21.19it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 21.15it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 21.17it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 21.17it/s]
 74%|███████▎  | 294/400 [00:13<00:05, 21.19it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 21.20it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 21.18it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 21.15it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 21.13it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 21.14it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 21.14it/s]
 79%|███████▉  | 315/400 [00:14<00:04, 21.16it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 21.17it/s]
 80%|████████  | 321/400 [00:15<00:03, 21.18it/s]
 81%|████████  | 324/400 [00:15<00:03, 21.19it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 21.16it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 21.13it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 21.10it/s]
 84%|████████▍ | 336/400 [00:15<00:03, 21.15it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 21.19it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 21.21it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 21.21it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 21.22it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 21.21it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 21.22it/s]
 89%|████████▉ | 357/400 [00:16<00:02, 21.23it/s]
 90%|█████████ | 360/400 [00:17<00:01, 21.25it/s]
 91%|█████████ | 363/400 [00:17<00:01, 21.28it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 21.30it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 21.29it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 21.25it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 21.24it/s]
 94%|█████████▍| 378/400 [00:17<00:01, 21.23it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 21.23it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 21.23it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 21.23it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 21.23it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 21.22it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.21it/s]
100%|██████████| 400/400 [00:18<00:00, 21.14it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.24it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.23it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.20it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.21it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.18it/s]
  4%|▍         | 18/400 [00:00<00:18, 21.20it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.19it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.20it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.20it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.20it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.20it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.20it/s]
 10%|▉         | 39/400 [00:01<00:17, 21.20it/s]
 10%|█         | 42/400 [00:01<00:16, 21.20it/s]
 11%|█▏        | 45/400 [00:02<00:16, 21.19it/s]
 12%|█▏        | 48/400 [00:02<00:16, 21.19it/s]
 13%|█▎        | 51/400 [00:02<00:16, 21.18it/s]
 14%|█▎        | 54/400 [00:02<00:16, 21.19it/s]
 14%|█▍        | 57/400 [00:02<00:16, 21.16it/s]
 15%|█▌        | 60/400 [00:02<00:16, 21.18it/s]
 16%|█▌        | 63/400 [00:02<00:15, 21.19it/s]
 16%|█▋        | 66/400 [00:03<00:15, 21.19it/s]
 17%|█▋        | 69/400 [00:03<00:15, 21.19it/s]
 18%|█▊        | 72/400 [00:03<00:15, 21.18it/s]
 19%|█▉        | 75/400 [00:03<00:15, 21.17it/s]
 20%|█▉        | 78/400 [00:03<00:15, 21.15it/s]
 20%|██        | 81/400 [00:03<00:15, 21.14it/s]
 21%|██        | 84/400 [00:03<00:14, 21.15it/s]
 22%|██▏       | 87/400 [00:04<00:14, 21.15it/s]
 22%|██▎       | 90/400 [00:04<00:14, 21.15it/s]
 23%|██▎       | 93/400 [00:04<00:14, 21.15it/s]
 24%|██▍       | 96/400 [00:04<00:14, 21.16it/s]
 25%|██▍       | 99/400 [00:04<00:14, 21.12it/s]
 26%|██▌       | 102/400 [00:04<00:14, 21.13it/s]
 26%|██▋       | 105/400 [00:04<00:13, 21.12it/s]
 27%|██▋       | 108/400 [00:05<00:13, 21.11it/s]
 28%|██▊       | 111/400 [00:05<00:13, 21.12it/s]
 28%|██▊       | 114/400 [00:05<00:13, 21.11it/s]
 29%|██▉       | 117/400 [00:05<00:13, 21.12it/s]
 30%|███       | 120/400 [00:05<00:13, 21.10it/s]
 31%|███       | 123/400 [00:05<00:13, 21.11it/s]
 32%|███▏      | 126/400 [00:05<00:12, 21.12it/s]
 32%|███▏      | 129/400 [00:06<00:12, 21.12it/s]
 33%|███▎      | 132/400 [00:06<00:12, 21.12it/s]
 34%|███▍      | 135/400 [00:06<00:12, 21.12it/s]
 34%|███▍      | 138/400 [00:06<00:12, 21.11it/s]
 35%|███▌      | 141/400 [00:06<00:12, 21.07it/s]
 36%|███▌      | 144/400 [00:06<00:12, 21.07it/s]
 37%|███▋      | 147/400 [00:06<00:12, 21.02it/s]
 38%|███▊      | 150/400 [00:07<00:11, 20.98it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.94it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.92it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.90it/s]
 40%|████      | 162/400 [00:07<00:11, 20.87it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.86it/s]
 42%|████▏     | 168/400 [00:07<00:11, 20.87it/s]
 43%|████▎     | 171/400 [00:08<00:10, 20.86it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.87it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.88it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.90it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.89it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.91it/s]
 47%|████▋     | 189/400 [00:08<00:10, 20.92it/s]
 48%|████▊     | 192/400 [00:09<00:09, 20.93it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.94it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.94it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.95it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.93it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 20.94it/s]
 52%|█████▎    | 210/400 [00:09<00:09, 20.93it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 20.93it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.95it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.94it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.94it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.92it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 20.91it/s]
 58%|█████▊    | 231/400 [00:10<00:08, 20.92it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 20.94it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.94it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.92it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.93it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.90it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 20.91it/s]
 63%|██████▎   | 252/400 [00:11<00:07, 20.92it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 20.94it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 20.93it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 20.92it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 20.89it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 20.86it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 20.86it/s]
 68%|██████▊   | 273/400 [00:12<00:06, 20.87it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.86it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.87it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.86it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.87it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.86it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 20.87it/s]
 74%|███████▎  | 294/400 [00:13<00:05, 20.87it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.88it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.87it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.87it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.88it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.87it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 20.88it/s]
 79%|███████▉  | 315/400 [00:14<00:04, 20.88it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.88it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.88it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.87it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.88it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.86it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 20.86it/s]
 84%|████████▍ | 336/400 [00:15<00:03, 20.87it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.88it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.86it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.90it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.93it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.92it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 20.93it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 20.92it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.91it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.91it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.88it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.87it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.86it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 20.87it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 20.86it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.86it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.87it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.83it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 20.83it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 20.82it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 20.83it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.84it/s]
100%|██████████| 400/400 [00:19<00:00, 20.98it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:19, 20.88it/s]
  2%|▏         | 6/400 [00:00<00:18, 20.85it/s]
  2%|▏         | 9/400 [00:00<00:18, 20.85it/s]
  3%|▎         | 12/400 [00:00<00:18, 20.84it/s]
  4%|▍         | 15/400 [00:00<00:18, 20.85it/s]
  4%|▍         | 18/400 [00:00<00:18, 20.85it/s]
  5%|▌         | 21/400 [00:01<00:18, 20.87it/s]
  6%|▌         | 24/400 [00:01<00:18, 20.88it/s]
  7%|▋         | 27/400 [00:01<00:17, 20.87it/s]
  8%|▊         | 30/400 [00:01<00:17, 20.88it/s]
  8%|▊         | 33/400 [00:01<00:17, 20.86it/s]
  9%|▉         | 36/400 [00:01<00:17, 20.85it/s]
 10%|▉         | 39/400 [00:01<00:17, 20.86it/s]
 10%|█         | 42/400 [00:02<00:17, 20.86it/s]
 11%|█▏        | 45/400 [00:02<00:17, 20.85it/s]
 12%|█▏        | 48/400 [00:02<00:16, 20.80it/s]
 13%|█▎        | 51/400 [00:02<00:16, 20.79it/s]
 14%|█▎        | 54/400 [00:02<00:16, 20.76it/s]
 14%|█▍        | 57/400 [00:02<00:16, 20.73it/s]
 15%|█▌        | 60/400 [00:02<00:16, 20.74it/s]
 16%|█▌        | 63/400 [00:03<00:16, 20.75it/s]
 16%|█▋        | 66/400 [00:03<00:16, 20.74it/s]
 17%|█▋        | 69/400 [00:03<00:15, 20.73it/s]
 18%|█▊        | 72/400 [00:03<00:15, 20.74it/s]
 19%|█▉        | 75/400 [00:03<00:15, 20.72it/s]
 20%|█▉        | 78/400 [00:03<00:15, 20.72it/s]
 20%|██        | 81/400 [00:03<00:15, 20.72it/s]
 21%|██        | 84/400 [00:04<00:15, 20.73it/s]
 22%|██▏       | 87/400 [00:04<00:15, 20.73it/s]
 22%|██▎       | 90/400 [00:04<00:14, 20.74it/s]
 23%|██▎       | 93/400 [00:04<00:14, 20.74it/s]
 24%|██▍       | 96/400 [00:04<00:14, 20.73it/s]
 25%|██▍       | 99/400 [00:04<00:14, 20.73it/s]
 26%|██▌       | 102/400 [00:04<00:14, 20.72it/s]
 26%|██▋       | 105/400 [00:05<00:14, 20.72it/s]
 27%|██▋       | 108/400 [00:05<00:14, 20.73it/s]
 28%|██▊       | 111/400 [00:05<00:13, 20.73it/s]
 28%|██▊       | 114/400 [00:05<00:13, 20.73it/s]
 29%|██▉       | 117/400 [00:05<00:13, 20.73it/s]
 30%|███       | 120/400 [00:05<00:13, 20.74it/s]
 31%|███       | 123/400 [00:05<00:13, 20.74it/s]
 32%|███▏      | 126/400 [00:06<00:13, 20.74it/s]
 32%|███▏      | 129/400 [00:06<00:13, 20.75it/s]
 33%|███▎      | 132/400 [00:06<00:12, 20.73it/s]
 34%|███▍      | 135/400 [00:06<00:12, 20.73it/s]
 34%|███▍      | 138/400 [00:06<00:12, 20.72it/s]
 35%|███▌      | 141/400 [00:06<00:12, 20.72it/s]
 36%|███▌      | 144/400 [00:06<00:12, 20.73it/s]
 37%|███▋      | 147/400 [00:07<00:12, 20.73it/s]
 38%|███▊      | 150/400 [00:07<00:12, 20.72it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.72it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.73it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.69it/s]
 40%|████      | 162/400 [00:07<00:11, 20.73it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.82it/s]
 42%|████▏     | 168/400 [00:08<00:11, 20.87it/s]
 43%|████▎     | 171/400 [00:08<00:10, 20.91it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.95it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.96it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.96it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.97it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.98it/s]
 47%|████▋     | 189/400 [00:09<00:10, 20.98it/s]
 48%|████▊     | 192/400 [00:09<00:09, 20.97it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.95it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.96it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.96it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.96it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 20.96it/s]
 52%|█████▎    | 210/400 [00:10<00:09, 20.96it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 20.95it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.95it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.95it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.94it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.94it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 20.93it/s]
 58%|█████▊    | 231/400 [00:11<00:08, 20.93it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 20.92it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.92it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.92it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.92it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.93it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 20.90it/s]
 63%|██████▎   | 252/400 [00:12<00:07, 20.90it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 20.92it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 20.93it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 20.94it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 20.93it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 20.92it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 20.92it/s]
 68%|██████▊   | 273/400 [00:13<00:06, 20.92it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.91it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.90it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.91it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.88it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.89it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 20.91it/s]
 74%|███████▎  | 294/400 [00:14<00:05, 20.91it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.91it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.91it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.90it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.88it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.89it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 20.89it/s]
 79%|███████▉  | 315/400 [00:15<00:04, 20.90it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.89it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.87it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.87it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.86it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.86it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 20.86it/s]
 84%|████████▍ | 336/400 [00:16<00:03, 20.87it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.87it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.90it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.93it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.91it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.90it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 20.88it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 20.88it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.87it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.87it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.86it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.84it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.78it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 20.73it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 20.70it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.68it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.66it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.66it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 20.66it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 20.67it/s]
 99%|█████████▉| 396/400 [00:19<00:00, 20.68it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.67it/s]
100%|██████████| 400/400 [00:19<00:00, 20.83it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:19, 20.71it/s]
  2%|▏         | 6/400 [00:00<00:19, 20.64it/s]
  2%|▏         | 9/400 [00:00<00:19, 19.93it/s]
  3%|▎         | 12/400 [00:00<00:19, 20.21it/s]
  4%|▍         | 15/400 [00:00<00:18, 20.38it/s]
  4%|▍         | 18/400 [00:00<00:18, 20.49it/s]
  5%|▌         | 21/400 [00:01<00:18, 20.56it/s]
  6%|▌         | 24/400 [00:01<00:18, 20.53it/s]
  7%|▋         | 27/400 [00:01<00:18, 20.58it/s]
  8%|▊         | 30/400 [00:01<00:17, 20.61it/s]
  8%|▊         | 33/400 [00:01<00:17, 20.64it/s]
  9%|▉         | 36/400 [00:01<00:17, 20.64it/s]
 10%|▉         | 39/400 [00:01<00:17, 20.63it/s]
 10%|█         | 42/400 [00:02<00:17, 20.63it/s]
 11%|█▏        | 45/400 [00:02<00:17, 20.62it/s]
 12%|█▏        | 48/400 [00:02<00:17, 20.61it/s]
 13%|█▎        | 51/400 [00:02<00:16, 20.61it/s]
 14%|█▎        | 54/400 [00:02<00:16, 20.61it/s]
 14%|█▍        | 57/400 [00:02<00:16, 20.64it/s]
 15%|█▌        | 60/400 [00:02<00:16, 20.67it/s]
 16%|█▌        | 63/400 [00:03<00:16, 20.68it/s]
 16%|█▋        | 66/400 [00:03<00:16, 20.68it/s]
 17%|█▋        | 69/400 [00:03<00:15, 20.70it/s]
 18%|█▊        | 72/400 [00:03<00:15, 20.69it/s]
 19%|█▉        | 75/400 [00:03<00:15, 20.70it/s]
 20%|█▉        | 78/400 [00:03<00:15, 20.70it/s]
 20%|██        | 81/400 [00:03<00:15, 20.72it/s]
 21%|██        | 84/400 [00:04<00:15, 20.73it/s]
 22%|██▏       | 87/400 [00:04<00:15, 20.76it/s]
 22%|██▎       | 90/400 [00:04<00:14, 20.77it/s]
 23%|██▎       | 93/400 [00:04<00:14, 20.76it/s]
 24%|██▍       | 96/400 [00:04<00:14, 20.78it/s]
 25%|██▍       | 99/400 [00:04<00:14, 20.79it/s]
 26%|██▌       | 102/400 [00:04<00:14, 20.78it/s]
 26%|██▋       | 105/400 [00:05<00:14, 20.79it/s]
 27%|██▋       | 108/400 [00:05<00:14, 20.79it/s]
 28%|██▊       | 111/400 [00:05<00:13, 20.79it/s]
 28%|██▊       | 114/400 [00:05<00:13, 20.78it/s]
 29%|██▉       | 117/400 [00:05<00:13, 20.79it/s]
 30%|███       | 120/400 [00:05<00:13, 20.78it/s]
 31%|███       | 123/400 [00:05<00:13, 20.80it/s]
 32%|███▏      | 126/400 [00:06<00:13, 20.77it/s]
 32%|███▏      | 129/400 [00:06<00:13, 20.74it/s]
 33%|███▎      | 132/400 [00:06<00:12, 20.71it/s]
 34%|███▍      | 135/400 [00:06<00:12, 20.69it/s]
 34%|███▍      | 138/400 [00:06<00:12, 20.69it/s]
 35%|███▌      | 141/400 [00:06<00:12, 20.68it/s]
 36%|███▌      | 144/400 [00:06<00:12, 20.68it/s]
 37%|███▋      | 147/400 [00:07<00:12, 20.68it/s]
 38%|███▊      | 150/400 [00:07<00:12, 20.68it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.67it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.63it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.60it/s]
 40%|████      | 162/400 [00:07<00:11, 20.59it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.58it/s]
 42%|████▏     | 168/400 [00:08<00:11, 20.55it/s]
 43%|████▎     | 171/400 [00:08<00:11, 20.55it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.55it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.53it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.66it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.75it/s]
 46%|████▋     | 186/400 [00:09<00:10, 20.82it/s]
 47%|████▋     | 189/400 [00:09<00:10, 20.85it/s]
 48%|████▊     | 192/400 [00:09<00:09, 20.88it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.91it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.90it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.92it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.92it/s]
 52%|█████▏    | 207/400 [00:10<00:09, 20.93it/s]
 52%|█████▎    | 210/400 [00:10<00:09, 20.94it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 20.94it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.93it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.91it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.91it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.93it/s]
 57%|█████▋    | 228/400 [00:11<00:08, 20.93it/s]
 58%|█████▊    | 231/400 [00:11<00:08, 20.93it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 20.92it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.92it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.91it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.93it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.93it/s]
 62%|██████▏   | 249/400 [00:12<00:07, 20.93it/s]
 63%|██████▎   | 252/400 [00:12<00:07, 20.93it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 20.93it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 20.94it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 20.92it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 20.93it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 20.93it/s]
 68%|██████▊   | 270/400 [00:13<00:06, 20.94it/s]
 68%|██████▊   | 273/400 [00:13<00:06, 20.92it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.91it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.91it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.90it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.90it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.91it/s]
 73%|███████▎  | 291/400 [00:14<00:05, 20.87it/s]
 74%|███████▎  | 294/400 [00:14<00:05, 20.88it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.89it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.90it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.88it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.89it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.90it/s]
 78%|███████▊  | 312/400 [00:15<00:04, 20.89it/s]
 79%|███████▉  | 315/400 [00:15<00:04, 20.90it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.90it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.90it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.89it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.90it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.90it/s]
 83%|████████▎ | 333/400 [00:16<00:03, 20.90it/s]
 84%|████████▍ | 336/400 [00:16<00:03, 20.89it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.90it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.90it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.90it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.89it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.90it/s]
 88%|████████▊ | 354/400 [00:17<00:02, 20.91it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 20.90it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.90it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.90it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.89it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.89it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.89it/s]
 94%|█████████▍| 375/400 [00:18<00:01, 20.90it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 20.90it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.90it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.90it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.91it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 21.05it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 21.16it/s]
 99%|█████████▉| 396/400 [00:19<00:00, 21.20it/s]
100%|█████████▉| 399/400 [00:19<00:00, 21.22it/s]
100%|██████████| 400/400 [00:19<00:00, 20.81it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.33it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.31it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.31it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.30it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.30it/s]
  4%|▍         | 18/400 [00:00<00:17, 21.30it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.30it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.30it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.29it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.28it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.28it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.28it/s]
 10%|▉         | 39/400 [00:01<00:16, 21.27it/s]
 10%|█         | 42/400 [00:01<00:16, 21.28it/s]
 11%|█▏        | 45/400 [00:02<00:16, 21.27it/s]
 12%|█▏        | 48/400 [00:02<00:16, 21.26it/s]
 13%|█▎        | 51/400 [00:02<00:16, 21.25it/s]
 14%|█▎        | 54/400 [00:02<00:16, 21.24it/s]
 14%|█▍        | 57/400 [00:02<00:16, 21.25it/s]
 15%|█▌        | 60/400 [00:02<00:15, 21.25it/s]
 16%|█▌        | 63/400 [00:02<00:15, 21.24it/s]
 16%|█▋        | 66/400 [00:03<00:15, 21.24it/s]
 17%|█▋        | 69/400 [00:03<00:15, 21.24it/s]
 18%|█▊        | 72/400 [00:03<00:15, 21.23it/s]
 19%|█▉        | 75/400 [00:03<00:15, 21.24it/s]
 20%|█▉        | 78/400 [00:03<00:15, 21.25it/s]
 20%|██        | 81/400 [00:03<00:15, 21.24it/s]
 21%|██        | 84/400 [00:03<00:14, 21.24it/s]
 22%|██▏       | 87/400 [00:04<00:14, 21.24it/s]
 22%|██▎       | 90/400 [00:04<00:14, 21.24it/s]
 23%|██▎       | 93/400 [00:04<00:14, 21.22it/s]
 24%|██▍       | 96/400 [00:04<00:14, 21.23it/s]
 25%|██▍       | 99/400 [00:04<00:14, 21.23it/s]
 26%|██▌       | 102/400 [00:04<00:14, 21.23it/s]
 26%|██▋       | 105/400 [00:04<00:13, 21.23it/s]
 27%|██▋       | 108/400 [00:05<00:13, 21.23it/s]
 28%|██▊       | 111/400 [00:05<00:13, 21.24it/s]
 28%|██▊       | 114/400 [00:05<00:13, 21.23it/s]
 29%|██▉       | 117/400 [00:05<00:13, 21.23it/s]
 30%|███       | 120/400 [00:05<00:13, 21.23it/s]
 31%|███       | 123/400 [00:05<00:13, 21.24it/s]
 32%|███▏      | 126/400 [00:05<00:12, 21.24it/s]
 32%|███▏      | 129/400 [00:06<00:12, 21.25it/s]
 33%|███▎      | 132/400 [00:06<00:12, 21.24it/s]
 34%|███▍      | 135/400 [00:06<00:12, 21.22it/s]
 34%|███▍      | 138/400 [00:06<00:12, 21.23it/s]
 35%|███▌      | 141/400 [00:06<00:12, 21.23it/s]
 36%|███▌      | 144/400 [00:06<00:12, 21.22it/s]
 37%|███▋      | 147/400 [00:06<00:11, 21.22it/s]
 38%|███▊      | 150/400 [00:07<00:11, 21.22it/s]
 38%|███▊      | 153/400 [00:07<00:11, 21.23it/s]
 39%|███▉      | 156/400 [00:07<00:11, 21.20it/s]
 40%|███▉      | 159/400 [00:07<00:11, 21.20it/s]
 40%|████      | 162/400 [00:07<00:11, 21.21it/s]
 41%|████▏     | 165/400 [00:07<00:11, 21.21it/s]
 42%|████▏     | 168/400 [00:07<00:10, 21.23it/s]
 43%|████▎     | 171/400 [00:08<00:10, 21.24it/s]
 44%|████▎     | 174/400 [00:08<00:10, 21.25it/s]
 44%|████▍     | 177/400 [00:08<00:10, 21.21it/s]
 45%|████▌     | 180/400 [00:08<00:10, 21.21it/s]
 46%|████▌     | 183/400 [00:08<00:10, 21.22it/s]
 46%|████▋     | 186/400 [00:08<00:10, 21.23it/s]
 47%|████▋     | 189/400 [00:08<00:09, 21.23it/s]
 48%|████▊     | 192/400 [00:09<00:09, 21.23it/s]
 49%|████▉     | 195/400 [00:09<00:09, 21.21it/s]
 50%|████▉     | 198/400 [00:09<00:09, 21.21it/s]
 50%|█████     | 201/400 [00:09<00:09, 21.25it/s]
 51%|█████     | 204/400 [00:09<00:09, 21.34it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 21.40it/s]
 52%|█████▎    | 210/400 [00:09<00:08, 21.43it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 21.45it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 21.47it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 21.48it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 21.49it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 21.49it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 21.49it/s]
 58%|█████▊    | 231/400 [00:10<00:07, 21.49it/s]
 58%|█████▊    | 234/400 [00:10<00:07, 21.49it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 21.48it/s]
 60%|██████    | 240/400 [00:11<00:07, 21.48it/s]
 61%|██████    | 243/400 [00:11<00:07, 21.48it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 21.42it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 21.40it/s]
 63%|██████▎   | 252/400 [00:11<00:06, 21.42it/s]
 64%|██████▍   | 255/400 [00:11<00:06, 21.43it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 21.44it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 21.44it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 21.40it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 21.37it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 21.35it/s]
 68%|██████▊   | 273/400 [00:12<00:05, 21.34it/s]
 69%|██████▉   | 276/400 [00:12<00:05, 21.32it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 21.31it/s]
 70%|███████   | 282/400 [00:13<00:05, 21.30it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 21.28it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 21.28it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 21.27it/s]
 74%|███████▎  | 294/400 [00:13<00:04, 21.27it/s]
 74%|███████▍  | 297/400 [00:13<00:04, 21.28it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 21.28it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 21.28it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 21.27it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 21.26it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 21.26it/s]
 79%|███████▉  | 315/400 [00:14<00:03, 21.26it/s]
 80%|███████▉  | 318/400 [00:14<00:03, 21.26it/s]
 80%|████████  | 321/400 [00:15<00:03, 21.27it/s]
 81%|████████  | 324/400 [00:15<00:03, 21.27it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 21.24it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 21.24it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 21.25it/s]
 84%|████████▍ | 336/400 [00:15<00:03, 21.25it/s]
 85%|████████▍ | 339/400 [00:15<00:02, 21.25it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 21.26it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 21.26it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 21.25it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 21.24it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 21.25it/s]
 89%|████████▉ | 357/400 [00:16<00:02, 21.25it/s]
 90%|█████████ | 360/400 [00:16<00:01, 21.21it/s]
 91%|█████████ | 363/400 [00:17<00:01, 21.22it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 21.23it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 21.24it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 21.26it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 21.29it/s]
 94%|█████████▍| 378/400 [00:17<00:01, 21.30it/s]
 95%|█████████▌| 381/400 [00:17<00:00, 21.31it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 21.32it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 21.31it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 21.32it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 21.31it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 21.31it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.28it/s]
100%|██████████| 400/400 [00:18<00:00, 21.29it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.21it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.20it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.22it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.20it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.21it/s]
  4%|▍         | 18/400 [00:00<00:17, 21.24it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.25it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.24it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.25it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.26it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.26it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.23it/s]
 10%|▉         | 39/400 [00:01<00:16, 21.24it/s]
 10%|█         | 42/400 [00:01<00:16, 21.24it/s]
 11%|█▏        | 45/400 [00:02<00:16, 21.24it/s]
 12%|█▏        | 48/400 [00:02<00:16, 21.25it/s]
 13%|█▎        | 51/400 [00:02<00:16, 21.25it/s]
 14%|█▎        | 54/400 [00:02<00:16, 21.23it/s]
 14%|█▍        | 57/400 [00:02<00:16, 21.21it/s]
 15%|█▌        | 60/400 [00:02<00:16, 21.21it/s]
 16%|█▌        | 63/400 [00:02<00:15, 21.21it/s]
 16%|█▋        | 66/400 [00:03<00:15, 21.20it/s]
 17%|█▋        | 69/400 [00:03<00:15, 21.21it/s]
 18%|█▊        | 72/400 [00:03<00:15, 21.18it/s]
 19%|█▉        | 75/400 [00:03<00:15, 21.20it/s]
 20%|█▉        | 78/400 [00:03<00:15, 21.19it/s]
 20%|██        | 81/400 [00:03<00:15, 21.19it/s]
 21%|██        | 84/400 [00:03<00:14, 21.20it/s]
 22%|██▏       | 87/400 [00:04<00:14, 21.20it/s]
 22%|██▎       | 90/400 [00:04<00:14, 21.21it/s]
 23%|██▎       | 93/400 [00:04<00:14, 21.20it/s]
 24%|██▍       | 96/400 [00:04<00:14, 21.20it/s]
 25%|██▍       | 99/400 [00:04<00:14, 21.19it/s]
 26%|██▌       | 102/400 [00:04<00:14, 21.20it/s]
 26%|██▋       | 105/400 [00:04<00:13, 21.19it/s]
 27%|██▋       | 108/400 [00:05<00:13, 21.19it/s]
 28%|██▊       | 111/400 [00:05<00:13, 21.19it/s]
 28%|██▊       | 114/400 [00:05<00:13, 21.20it/s]
 29%|██▉       | 117/400 [00:05<00:13, 21.19it/s]
 30%|███       | 120/400 [00:05<00:13, 21.17it/s]
 31%|███       | 123/400 [00:05<00:13, 21.16it/s]
 32%|███▏      | 126/400 [00:05<00:12, 21.18it/s]
 32%|███▏      | 129/400 [00:06<00:12, 21.18it/s]
 33%|███▎      | 132/400 [00:06<00:12, 21.17it/s]
 34%|███▍      | 135/400 [00:06<00:12, 21.18it/s]
 34%|███▍      | 138/400 [00:06<00:12, 21.17it/s]
 35%|███▌      | 141/400 [00:06<00:12, 21.16it/s]
 36%|███▌      | 144/400 [00:06<00:12, 21.16it/s]
 37%|███▋      | 147/400 [00:06<00:11, 21.16it/s]
 38%|███▊      | 150/400 [00:07<00:11, 21.16it/s]
 38%|███▊      | 153/400 [00:07<00:11, 21.16it/s]
 39%|███▉      | 156/400 [00:07<00:11, 21.15it/s]
 40%|███▉      | 159/400 [00:07<00:11, 21.15it/s]
 40%|████      | 162/400 [00:07<00:11, 21.14it/s]
 41%|████▏     | 165/400 [00:07<00:11, 21.15it/s]
 42%|████▏     | 168/400 [00:07<00:10, 21.13it/s]
 43%|████▎     | 171/400 [00:08<00:10, 21.14it/s]
 44%|████▎     | 174/400 [00:08<00:10, 21.14it/s]
 44%|████▍     | 177/400 [00:08<00:10, 21.13it/s]
 45%|████▌     | 180/400 [00:08<00:10, 21.13it/s]
 46%|████▌     | 183/400 [00:08<00:10, 21.12it/s]
 46%|████▋     | 186/400 [00:08<00:10, 21.13it/s]
 47%|████▋     | 189/400 [00:08<00:09, 21.12it/s]
 48%|████▊     | 192/400 [00:09<00:09, 21.11it/s]
 49%|████▉     | 195/400 [00:09<00:09, 21.11it/s]
 50%|████▉     | 198/400 [00:09<00:09, 21.12it/s]
 50%|█████     | 201/400 [00:09<00:09, 21.13it/s]
 51%|█████     | 204/400 [00:09<00:09, 21.10it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 21.11it/s]
 52%|█████▎    | 210/400 [00:09<00:08, 21.12it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 21.11it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 21.07it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 21.08it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 21.09it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 21.12it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 21.16it/s]
 58%|█████▊    | 231/400 [00:10<00:07, 21.20it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 21.22it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 21.24it/s]
 60%|██████    | 240/400 [00:11<00:07, 21.25it/s]
 61%|██████    | 243/400 [00:11<00:07, 21.25it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 21.25it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 21.25it/s]
 63%|██████▎   | 252/400 [00:11<00:06, 21.24it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 21.24it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 21.24it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 21.24it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 21.24it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 21.24it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 21.23it/s]
 68%|██████▊   | 273/400 [00:12<00:05, 21.24it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 21.27it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 21.30it/s]
 70%|███████   | 282/400 [00:13<00:05, 21.32it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 21.34it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 21.34it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 21.33it/s]
 74%|███████▎  | 294/400 [00:13<00:04, 21.33it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 21.34it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 21.34it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 21.35it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 21.35it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 21.34it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 21.32it/s]
 79%|███████▉  | 315/400 [00:14<00:03, 21.32it/s]
 80%|███████▉  | 318/400 [00:14<00:03, 21.32it/s]
 80%|████████  | 321/400 [00:15<00:03, 21.33it/s]
 81%|████████  | 324/400 [00:15<00:03, 21.32it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 21.32it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 21.33it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 21.31it/s]
 84%|████████▍ | 336/400 [00:15<00:03, 21.31it/s]
 85%|████████▍ | 339/400 [00:15<00:02, 21.31it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 21.30it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 21.31it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 21.30it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 21.30it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 21.30it/s]
 89%|████████▉ | 357/400 [00:16<00:02, 21.30it/s]
 90%|█████████ | 360/400 [00:16<00:01, 21.30it/s]
 91%|█████████ | 363/400 [00:17<00:01, 21.30it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 21.30it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 21.30it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 21.29it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 21.26it/s]
 94%|█████████▍| 378/400 [00:17<00:01, 21.24it/s]
 95%|█████████▌| 381/400 [00:17<00:00, 21.23it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 21.22it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 21.21it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 21.21it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 21.21it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 21.18it/s]
100%|█████████▉| 399/400 [00:18<00:00, 21.19it/s]
100%|██████████| 400/400 [00:18<00:00, 21.22it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.21it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.21it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.21it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.19it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.18it/s]
  4%|▍         | 18/400 [00:00<00:18, 21.16it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.16it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.14it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.15it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.16it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.13it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.14it/s]
 10%|▉         | 39/400 [00:01<00:17, 21.06it/s]
 10%|█         | 42/400 [00:01<00:17, 21.00it/s]
 11%|█▏        | 45/400 [00:02<00:16, 20.96it/s]
 12%|█▏        | 48/400 [00:02<00:16, 20.92it/s]
 13%|█▎        | 51/400 [00:02<00:16, 20.91it/s]
 14%|█▎        | 54/400 [00:02<00:16, 20.90it/s]
 14%|█▍        | 57/400 [00:02<00:16, 20.89it/s]
 15%|█▌        | 60/400 [00:02<00:16, 20.87it/s]
 16%|█▌        | 63/400 [00:02<00:16, 20.88it/s]
 16%|█▋        | 66/400 [00:03<00:16, 20.86it/s]
 17%|█▋        | 69/400 [00:03<00:15, 20.87it/s]
 18%|█▊        | 72/400 [00:03<00:15, 20.87it/s]
 19%|█▉        | 75/400 [00:03<00:15, 20.87it/s]
 20%|█▉        | 78/400 [00:03<00:15, 20.88it/s]
 20%|██        | 81/400 [00:03<00:15, 20.87it/s]
 21%|██        | 84/400 [00:04<00:15, 20.85it/s]
 22%|██▏       | 87/400 [00:04<00:15, 20.86it/s]
 22%|██▎       | 90/400 [00:04<00:14, 20.89it/s]
 23%|██▎       | 93/400 [00:04<00:14, 20.92it/s]
 24%|██▍       | 96/400 [00:04<00:14, 20.94it/s]
 25%|██▍       | 99/400 [00:04<00:14, 20.95it/s]
 26%|██▌       | 102/400 [00:04<00:14, 20.92it/s]
 26%|██▋       | 105/400 [00:05<00:14, 20.93it/s]
 27%|██▋       | 108/400 [00:05<00:13, 20.93it/s]
 28%|██▊       | 111/400 [00:05<00:13, 20.91it/s]
 28%|██▊       | 114/400 [00:05<00:13, 20.91it/s]
 29%|██▉       | 117/400 [00:05<00:13, 20.90it/s]
 30%|███       | 120/400 [00:05<00:13, 20.85it/s]
 31%|███       | 123/400 [00:05<00:13, 20.82it/s]
 32%|███▏      | 126/400 [00:06<00:13, 20.82it/s]
 32%|███▏      | 129/400 [00:06<00:13, 20.82it/s]
 33%|███▎      | 132/400 [00:06<00:12, 20.81it/s]
 34%|███▍      | 135/400 [00:06<00:12, 20.81it/s]
 34%|███▍      | 138/400 [00:06<00:12, 20.80it/s]
 35%|███▌      | 141/400 [00:06<00:12, 20.79it/s]
 36%|███▌      | 144/400 [00:06<00:12, 20.79it/s]
 37%|███▋      | 147/400 [00:07<00:12, 20.79it/s]
 38%|███▊      | 150/400 [00:07<00:12, 20.79it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.78it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.77it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.77it/s]
 40%|████      | 162/400 [00:07<00:11, 20.77it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.76it/s]
 42%|████▏     | 168/400 [00:08<00:11, 20.76it/s]
 43%|████▎     | 171/400 [00:08<00:11, 20.75it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.74it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.75it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.78it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.82it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.81it/s]
 47%|████▋     | 189/400 [00:09<00:10, 20.81it/s]
 48%|████▊     | 192/400 [00:09<00:09, 20.81it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.79it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.79it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.80it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.79it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 20.78it/s]
 52%|█████▎    | 210/400 [00:10<00:09, 20.78it/s]
 53%|█████▎    | 213/400 [00:10<00:09, 20.77it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.78it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.81it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.82it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.85it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 20.81it/s]
 58%|█████▊    | 231/400 [00:11<00:08, 20.84it/s]
 58%|█████▊    | 234/400 [00:11<00:08, 20.68it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.75it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.81it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.84it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.79it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 20.91it/s]
 63%|██████▎   | 252/400 [00:12<00:07, 21.01it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 21.08it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 21.12it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 21.16it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 21.17it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 21.18it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 21.19it/s]
 68%|██████▊   | 273/400 [00:13<00:05, 21.21it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 21.21it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 21.21it/s]
 70%|███████   | 282/400 [00:13<00:05, 21.21it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 21.21it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 21.21it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 21.20it/s]
 74%|███████▎  | 294/400 [00:14<00:04, 21.21it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 21.22it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 21.20it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 21.20it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 21.21it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 21.20it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 21.20it/s]
 79%|███████▉  | 315/400 [00:15<00:04, 21.21it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 21.20it/s]
 80%|████████  | 321/400 [00:15<00:03, 21.20it/s]
 81%|████████  | 324/400 [00:15<00:03, 21.20it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 21.22it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 21.22it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 21.20it/s]
 84%|████████▍ | 336/400 [00:16<00:03, 21.20it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 21.19it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 21.19it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 21.20it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 21.19it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 21.19it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 21.17it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 21.18it/s]
 90%|█████████ | 360/400 [00:17<00:01, 21.17it/s]
 91%|█████████ | 363/400 [00:17<00:01, 21.18it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 21.19it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 21.20it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 21.17it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 21.15it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 21.15it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 21.14it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 21.14it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 21.17it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 21.19it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 21.21it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 21.21it/s]
100%|█████████▉| 399/400 [00:19<00:00, 21.21it/s]
100%|██████████| 400/400 [00:19<00:00, 21.00it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:18, 21.25it/s]
  2%|▏         | 6/400 [00:00<00:18, 21.24it/s]
  2%|▏         | 9/400 [00:00<00:18, 21.23it/s]
  3%|▎         | 12/400 [00:00<00:18, 21.23it/s]
  4%|▍         | 15/400 [00:00<00:18, 21.24it/s]
  4%|▍         | 18/400 [00:00<00:17, 21.24it/s]
  5%|▌         | 21/400 [00:00<00:17, 21.23it/s]
  6%|▌         | 24/400 [00:01<00:17, 21.22it/s]
  7%|▋         | 27/400 [00:01<00:17, 21.20it/s]
  8%|▊         | 30/400 [00:01<00:17, 21.20it/s]
  8%|▊         | 33/400 [00:01<00:17, 21.21it/s]
  9%|▉         | 36/400 [00:01<00:17, 21.21it/s]
 10%|▉         | 39/400 [00:01<00:17, 21.21it/s]
 10%|█         | 42/400 [00:01<00:16, 21.22it/s]
 11%|█▏        | 45/400 [00:02<00:16, 21.23it/s]
 12%|█▏        | 48/400 [00:02<00:16, 21.26it/s]
 13%|█▎        | 51/400 [00:02<00:16, 21.28it/s]
 14%|█▎        | 54/400 [00:02<00:16, 21.29it/s]
 14%|█▍        | 57/400 [00:02<00:16, 21.30it/s]
 15%|█▌        | 60/400 [00:02<00:15, 21.33it/s]
 16%|█▌        | 63/400 [00:02<00:15, 21.35it/s]
 16%|█▋        | 66/400 [00:03<00:15, 21.31it/s]
 17%|█▋        | 69/400 [00:03<00:15, 21.32it/s]
 18%|█▊        | 72/400 [00:03<00:15, 21.35it/s]
 19%|█▉        | 75/400 [00:03<00:15, 21.37it/s]
 20%|█▉        | 78/400 [00:03<00:15, 21.38it/s]
 20%|██        | 81/400 [00:03<00:14, 21.39it/s]
 21%|██        | 84/400 [00:03<00:14, 21.39it/s]
 22%|██▏       | 87/400 [00:04<00:14, 21.37it/s]
 22%|██▎       | 90/400 [00:04<00:14, 21.34it/s]
 23%|██▎       | 93/400 [00:04<00:14, 21.31it/s]
 24%|██▍       | 96/400 [00:04<00:14, 21.29it/s]
 25%|██▍       | 99/400 [00:04<00:14, 21.28it/s]
 26%|██▌       | 102/400 [00:04<00:14, 21.28it/s]
 26%|██▋       | 105/400 [00:04<00:13, 21.26it/s]
 27%|██▋       | 108/400 [00:05<00:13, 21.26it/s]
 28%|██▊       | 111/400 [00:05<00:13, 21.26it/s]
 28%|██▊       | 114/400 [00:05<00:13, 21.26it/s]
 29%|██▉       | 117/400 [00:05<00:13, 21.26it/s]
 30%|███       | 120/400 [00:05<00:13, 21.26it/s]
 31%|███       | 123/400 [00:05<00:13, 21.26it/s]
 32%|███▏      | 126/400 [00:05<00:12, 21.25it/s]
 32%|███▏      | 129/400 [00:06<00:12, 21.25it/s]
 33%|███▎      | 132/400 [00:06<00:12, 21.24it/s]
 34%|███▍      | 135/400 [00:06<00:12, 21.24it/s]
 34%|███▍      | 138/400 [00:06<00:12, 21.24it/s]
 35%|███▌      | 141/400 [00:06<00:12, 21.24it/s]
 36%|███▌      | 144/400 [00:06<00:12, 21.24it/s]
 37%|███▋      | 147/400 [00:06<00:11, 21.23it/s]
 38%|███▊      | 150/400 [00:07<00:11, 21.22it/s]
 38%|███▊      | 153/400 [00:07<00:11, 21.23it/s]
 39%|███▉      | 156/400 [00:07<00:11, 21.23it/s]
 40%|███▉      | 159/400 [00:07<00:11, 21.24it/s]
 40%|████      | 162/400 [00:07<00:11, 21.24it/s]
 41%|████▏     | 165/400 [00:07<00:11, 21.25it/s]
 42%|████▏     | 168/400 [00:07<00:10, 21.24it/s]
 43%|████▎     | 171/400 [00:08<00:10, 21.24it/s]
 44%|████▎     | 174/400 [00:08<00:10, 21.23it/s]
 44%|████▍     | 177/400 [00:08<00:10, 21.24it/s]
 45%|████▌     | 180/400 [00:08<00:10, 21.24it/s]
 46%|████▌     | 183/400 [00:08<00:10, 21.24it/s]
 46%|████▋     | 186/400 [00:08<00:10, 21.25it/s]
 47%|████▋     | 189/400 [00:08<00:09, 21.22it/s]
 48%|████▊     | 192/400 [00:09<00:09, 21.23it/s]
 49%|████▉     | 195/400 [00:09<00:09, 21.23it/s]
 50%|████▉     | 198/400 [00:09<00:09, 21.24it/s]
 50%|█████     | 201/400 [00:09<00:09, 21.24it/s]
 51%|█████     | 204/400 [00:09<00:09, 21.23it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 21.21it/s]
 52%|█████▎    | 210/400 [00:09<00:08, 21.21it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 21.22it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 21.21it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 21.20it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 21.21it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 21.21it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 21.20it/s]
 58%|█████▊    | 231/400 [00:10<00:07, 21.20it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 21.21it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 21.19it/s]
 60%|██████    | 240/400 [00:11<00:07, 21.18it/s]
 61%|██████    | 243/400 [00:11<00:07, 21.18it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 21.14it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 21.14it/s]
 63%|██████▎   | 252/400 [00:11<00:07, 21.11it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 21.11it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 21.11it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 21.11it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 21.11it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 21.11it/s]
 68%|██████▊   | 270/400 [00:12<00:06, 21.07it/s]
 68%|██████▊   | 273/400 [00:12<00:06, 20.94it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.86it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.81it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.74it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.71it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.70it/s]
 73%|███████▎  | 291/400 [00:13<00:05, 20.70it/s]
 74%|███████▎  | 294/400 [00:13<00:05, 20.68it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.68it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.66it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.66it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.66it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.66it/s]
 78%|███████▊  | 312/400 [00:14<00:04, 20.66it/s]
 79%|███████▉  | 315/400 [00:14<00:04, 20.66it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.66it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.66it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.68it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.71it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.71it/s]
 83%|████████▎ | 333/400 [00:15<00:03, 20.71it/s]
 84%|████████▍ | 336/400 [00:15<00:03, 20.69it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.71it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.72it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.73it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.73it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.73it/s]
 88%|████████▊ | 354/400 [00:16<00:02, 20.73it/s]
 89%|████████▉ | 357/400 [00:16<00:02, 20.72it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.72it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.72it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.73it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.74it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.73it/s]
 94%|█████████▍| 375/400 [00:17<00:01, 20.74it/s]
 94%|█████████▍| 378/400 [00:17<00:01, 20.71it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.71it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.72it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.71it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 20.72it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 20.72it/s]
 99%|█████████▉| 396/400 [00:18<00:00, 20.71it/s]
100%|█████████▉| 399/400 [00:18<00:00, 20.70it/s]
100%|██████████| 400/400 [00:18<00:00, 21.06it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:19, 20.71it/s]
  2%|▏         | 6/400 [00:00<00:19, 20.70it/s]
  2%|▏         | 9/400 [00:00<00:18, 20.72it/s]
  3%|▎         | 12/400 [00:00<00:18, 20.72it/s]
  4%|▍         | 15/400 [00:00<00:18, 20.73it/s]
  4%|▍         | 18/400 [00:00<00:18, 20.73it/s]
  5%|▌         | 21/400 [00:01<00:18, 20.73it/s]
  6%|▌         | 24/400 [00:01<00:18, 20.72it/s]
  7%|▋         | 27/400 [00:01<00:17, 20.73it/s]
  8%|▊         | 30/400 [00:01<00:17, 20.73it/s]
  8%|▊         | 33/400 [00:01<00:17, 20.73it/s]
  9%|▉         | 36/400 [00:01<00:17, 20.73it/s]
 10%|▉         | 39/400 [00:01<00:17, 20.74it/s]
 10%|█         | 42/400 [00:02<00:17, 20.72it/s]
 11%|█▏        | 45/400 [00:02<00:17, 20.73it/s]
 12%|█▏        | 48/400 [00:02<00:16, 20.76it/s]
 13%|█▎        | 51/400 [00:02<00:16, 20.78it/s]
 14%|█▎        | 54/400 [00:02<00:16, 20.76it/s]
 14%|█▍        | 57/400 [00:02<00:16, 20.76it/s]
 15%|█▌        | 60/400 [00:02<00:16, 20.74it/s]
 16%|█▌        | 63/400 [00:03<00:16, 20.72it/s]
 16%|█▋        | 66/400 [00:03<00:16, 20.72it/s]
 17%|█▋        | 69/400 [00:03<00:15, 20.71it/s]
 18%|█▊        | 72/400 [00:03<00:15, 20.71it/s]
 19%|█▉        | 75/400 [00:03<00:15, 20.72it/s]
 20%|█▉        | 78/400 [00:03<00:15, 20.71it/s]
 20%|██        | 81/400 [00:03<00:15, 20.70it/s]
 21%|██        | 84/400 [00:04<00:15, 20.72it/s]
 22%|██▏       | 87/400 [00:04<00:15, 20.73it/s]
 22%|██▎       | 90/400 [00:04<00:14, 20.75it/s]
 23%|██▎       | 93/400 [00:04<00:14, 20.75it/s]
 24%|██▍       | 96/400 [00:04<00:14, 20.77it/s]
 25%|██▍       | 99/400 [00:04<00:14, 20.79it/s]
 26%|██▌       | 102/400 [00:04<00:14, 20.81it/s]
 26%|██▋       | 105/400 [00:05<00:14, 20.82it/s]
 27%|██▋       | 108/400 [00:05<00:14, 20.83it/s]
 28%|██▊       | 111/400 [00:05<00:13, 20.83it/s]
 28%|██▊       | 114/400 [00:05<00:13, 20.85it/s]
 29%|██▉       | 117/400 [00:05<00:13, 20.83it/s]
 30%|███       | 120/400 [00:05<00:13, 20.84it/s]
 31%|███       | 123/400 [00:05<00:13, 20.83it/s]
 32%|███▏      | 126/400 [00:06<00:13, 20.84it/s]
 32%|███▏      | 129/400 [00:06<00:13, 20.83it/s]
 33%|███▎      | 132/400 [00:06<00:12, 20.84it/s]
 34%|███▍      | 135/400 [00:06<00:12, 20.84it/s]
 34%|███▍      | 138/400 [00:06<00:12, 20.85it/s]
 35%|███▌      | 141/400 [00:06<00:12, 20.84it/s]
 36%|███▌      | 144/400 [00:06<00:12, 20.82it/s]
 37%|███▋      | 147/400 [00:07<00:12, 20.83it/s]
 38%|███▊      | 150/400 [00:07<00:12, 20.83it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.83it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.82it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.80it/s]
 40%|████      | 162/400 [00:07<00:11, 20.79it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.78it/s]
 42%|████▏     | 168/400 [00:08<00:11, 20.77it/s]
 43%|████▎     | 171/400 [00:08<00:11, 20.76it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.75it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.74it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.73it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.71it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.68it/s]
 47%|████▋     | 189/400 [00:09<00:10, 20.68it/s]
 48%|████▊     | 192/400 [00:09<00:10, 20.69it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.69it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.70it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.72it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.73it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 20.73it/s]
 52%|█████▎    | 210/400 [00:10<00:09, 20.75it/s]
 53%|█████▎    | 213/400 [00:10<00:09, 20.75it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.76it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.76it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.77it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.77it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 20.75it/s]
 58%|█████▊    | 231/400 [00:11<00:08, 20.75it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 20.76it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.75it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.76it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.76it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.76it/s]
 62%|██████▏   | 249/400 [00:11<00:07, 20.75it/s]
 63%|██████▎   | 252/400 [00:12<00:07, 20.75it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 20.74it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 20.75it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 20.75it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 20.73it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 20.73it/s]
 68%|██████▊   | 270/400 [00:13<00:06, 20.72it/s]
 68%|██████▊   | 273/400 [00:13<00:06, 20.74it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.73it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.72it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.72it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.73it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.73it/s]
 73%|███████▎  | 291/400 [00:14<00:05, 20.72it/s]
 74%|███████▎  | 294/400 [00:14<00:05, 20.72it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.72it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.71it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.70it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.70it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.70it/s]
 78%|███████▊  | 312/400 [00:15<00:04, 20.69it/s]
 79%|███████▉  | 315/400 [00:15<00:04, 20.70it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.69it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.67it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.65it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.65it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.64it/s]
 83%|████████▎ | 333/400 [00:16<00:03, 20.62it/s]
 84%|████████▍ | 336/400 [00:16<00:03, 20.65it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.68it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.70it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.71it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.74it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.77it/s]
 88%|████████▊ | 354/400 [00:17<00:02, 20.75it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 20.73it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.76it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.78it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.78it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.79it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.79it/s]
 94%|█████████▍| 375/400 [00:18<00:01, 20.78it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 20.79it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.79it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.78it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.79it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 20.78it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 20.76it/s]
 99%|█████████▉| 396/400 [00:19<00:00, 20.72it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.72it/s]
100%|██████████| 400/400 [00:19<00:00, 20.75it/s]

  0%|          | 0/400 [00:00<?, ?it/s]
  1%|          | 3/400 [00:00<00:19, 20.73it/s]
  2%|▏         | 6/400 [00:00<00:19, 20.72it/s]
  2%|▏         | 9/400 [00:00<00:18, 20.71it/s]
  3%|▎         | 12/400 [00:00<00:18, 20.72it/s]
  4%|▍         | 15/400 [00:00<00:18, 20.69it/s]
  4%|▍         | 18/400 [00:00<00:18, 20.71it/s]
  5%|▌         | 21/400 [00:01<00:18, 20.72it/s]
  6%|▌         | 24/400 [00:01<00:18, 20.75it/s]
  7%|▋         | 27/400 [00:01<00:17, 20.77it/s]
  8%|▊         | 30/400 [00:01<00:17, 20.77it/s]
  8%|▊         | 33/400 [00:01<00:17, 20.77it/s]
  9%|▉         | 36/400 [00:01<00:17, 20.74it/s]
 10%|▉         | 39/400 [00:01<00:17, 20.70it/s]
 10%|█         | 42/400 [00:02<00:17, 20.69it/s]
 11%|█▏        | 45/400 [00:02<00:17, 20.68it/s]
 12%|█▏        | 48/400 [00:02<00:17, 20.67it/s]
 13%|█▎        | 51/400 [00:02<00:16, 20.67it/s]
 14%|█▎        | 54/400 [00:02<00:16, 20.67it/s]
 14%|█▍        | 57/400 [00:02<00:16, 20.65it/s]
 15%|█▌        | 60/400 [00:02<00:16, 20.64it/s]
 16%|█▌        | 63/400 [00:03<00:16, 20.64it/s]
 16%|█▋        | 66/400 [00:03<00:16, 20.65it/s]
 17%|█▋        | 69/400 [00:03<00:16, 20.63it/s]
 18%|█▊        | 72/400 [00:03<00:15, 20.63it/s]
 19%|█▉        | 75/400 [00:03<00:15, 20.64it/s]
 20%|█▉        | 78/400 [00:03<00:15, 20.63it/s]
 20%|██        | 81/400 [00:03<00:15, 20.64it/s]
 21%|██        | 84/400 [00:04<00:15, 20.63it/s]
 22%|██▏       | 87/400 [00:04<00:15, 20.63it/s]
 22%|██▎       | 90/400 [00:04<00:15, 20.63it/s]
 23%|██▎       | 93/400 [00:04<00:14, 20.66it/s]
 24%|██▍       | 96/400 [00:04<00:14, 20.72it/s]
 25%|██▍       | 99/400 [00:04<00:14, 20.73it/s]
 26%|██▌       | 102/400 [00:04<00:14, 20.75it/s]
 26%|██▋       | 105/400 [00:05<00:14, 20.77it/s]
 27%|██▋       | 108/400 [00:05<00:14, 20.79it/s]
 28%|██▊       | 111/400 [00:05<00:13, 20.79it/s]
 28%|██▊       | 114/400 [00:05<00:13, 20.81it/s]
 29%|██▉       | 117/400 [00:05<00:13, 20.80it/s]
 30%|███       | 120/400 [00:05<00:13, 20.80it/s]
 31%|███       | 123/400 [00:05<00:13, 20.81it/s]
 32%|███▏      | 126/400 [00:06<00:13, 20.82it/s]
 32%|███▏      | 129/400 [00:06<00:13, 20.82it/s]
 33%|███▎      | 132/400 [00:06<00:12, 20.81it/s]
 34%|███▍      | 135/400 [00:06<00:12, 20.81it/s]
 34%|███▍      | 138/400 [00:06<00:12, 20.82it/s]
 35%|███▌      | 141/400 [00:06<00:12, 20.79it/s]
 36%|███▌      | 144/400 [00:06<00:12, 20.79it/s]
 37%|███▋      | 147/400 [00:07<00:12, 20.79it/s]
 38%|███▊      | 150/400 [00:07<00:12, 20.78it/s]
 38%|███▊      | 153/400 [00:07<00:11, 20.78it/s]
 39%|███▉      | 156/400 [00:07<00:11, 20.79it/s]
 40%|███▉      | 159/400 [00:07<00:11, 20.79it/s]
 40%|████      | 162/400 [00:07<00:11, 20.79it/s]
 41%|████▏     | 165/400 [00:07<00:11, 20.77it/s]
 42%|████▏     | 168/400 [00:08<00:11, 20.75it/s]
 43%|████▎     | 171/400 [00:08<00:11, 20.75it/s]
 44%|████▎     | 174/400 [00:08<00:10, 20.74it/s]
 44%|████▍     | 177/400 [00:08<00:10, 20.74it/s]
 45%|████▌     | 180/400 [00:08<00:10, 20.72it/s]
 46%|████▌     | 183/400 [00:08<00:10, 20.71it/s]
 46%|████▋     | 186/400 [00:08<00:10, 20.70it/s]
 47%|████▋     | 189/400 [00:09<00:10, 20.70it/s]
 48%|████▊     | 192/400 [00:09<00:10, 20.70it/s]
 49%|████▉     | 195/400 [00:09<00:09, 20.70it/s]
 50%|████▉     | 198/400 [00:09<00:09, 20.71it/s]
 50%|█████     | 201/400 [00:09<00:09, 20.71it/s]
 51%|█████     | 204/400 [00:09<00:09, 20.69it/s]
 52%|█████▏    | 207/400 [00:09<00:09, 20.72it/s]
 52%|█████▎    | 210/400 [00:10<00:09, 20.79it/s]
 53%|█████▎    | 213/400 [00:10<00:08, 20.81it/s]
 54%|█████▍    | 216/400 [00:10<00:08, 20.83it/s]
 55%|█████▍    | 219/400 [00:10<00:08, 20.85it/s]
 56%|█████▌    | 222/400 [00:10<00:08, 20.86it/s]
 56%|█████▋    | 225/400 [00:10<00:08, 20.83it/s]
 57%|█████▋    | 228/400 [00:10<00:08, 20.83it/s]
 58%|█████▊    | 231/400 [00:11<00:08, 20.84it/s]
 58%|█████▊    | 234/400 [00:11<00:07, 20.85it/s]
 59%|█████▉    | 237/400 [00:11<00:07, 20.83it/s]
 60%|██████    | 240/400 [00:11<00:07, 20.81it/s]
 61%|██████    | 243/400 [00:11<00:07, 20.80it/s]
 62%|██████▏   | 246/400 [00:11<00:07, 20.81it/s]
 62%|██████▏   | 249/400 [00:12<00:07, 20.82it/s]
 63%|██████▎   | 252/400 [00:12<00:07, 20.83it/s]
 64%|██████▍   | 255/400 [00:12<00:06, 20.84it/s]
 64%|██████▍   | 258/400 [00:12<00:06, 20.85it/s]
 65%|██████▌   | 261/400 [00:12<00:06, 20.85it/s]
 66%|██████▌   | 264/400 [00:12<00:06, 20.86it/s]
 67%|██████▋   | 267/400 [00:12<00:06, 20.84it/s]
 68%|██████▊   | 270/400 [00:13<00:06, 20.84it/s]
 68%|██████▊   | 273/400 [00:13<00:06, 20.84it/s]
 69%|██████▉   | 276/400 [00:13<00:05, 20.82it/s]
 70%|██████▉   | 279/400 [00:13<00:05, 20.80it/s]
 70%|███████   | 282/400 [00:13<00:05, 20.80it/s]
 71%|███████▏  | 285/400 [00:13<00:05, 20.77it/s]
 72%|███████▏  | 288/400 [00:13<00:05, 20.59it/s]
 73%|███████▎  | 291/400 [00:14<00:05, 20.66it/s]
 74%|███████▎  | 294/400 [00:14<00:05, 20.72it/s]
 74%|███████▍  | 297/400 [00:14<00:04, 20.76it/s]
 75%|███████▌  | 300/400 [00:14<00:04, 20.76it/s]
 76%|███████▌  | 303/400 [00:14<00:04, 20.73it/s]
 76%|███████▋  | 306/400 [00:14<00:04, 20.68it/s]
 77%|███████▋  | 309/400 [00:14<00:04, 20.64it/s]
 78%|███████▊  | 312/400 [00:15<00:04, 20.62it/s]
 79%|███████▉  | 315/400 [00:15<00:04, 20.61it/s]
 80%|███████▉  | 318/400 [00:15<00:03, 20.59it/s]
 80%|████████  | 321/400 [00:15<00:03, 20.58it/s]
 81%|████████  | 324/400 [00:15<00:03, 20.57it/s]
 82%|████████▏ | 327/400 [00:15<00:03, 20.56it/s]
 82%|████████▎ | 330/400 [00:15<00:03, 20.56it/s]
 83%|████████▎ | 333/400 [00:16<00:03, 20.56it/s]
 84%|████████▍ | 336/400 [00:16<00:03, 20.55it/s]
 85%|████████▍ | 339/400 [00:16<00:02, 20.52it/s]
 86%|████████▌ | 342/400 [00:16<00:02, 20.52it/s]
 86%|████████▋ | 345/400 [00:16<00:02, 20.51it/s]
 87%|████████▋ | 348/400 [00:16<00:02, 20.49it/s]
 88%|████████▊ | 351/400 [00:16<00:02, 20.47it/s]
 88%|████████▊ | 354/400 [00:17<00:02, 20.49it/s]
 89%|████████▉ | 357/400 [00:17<00:02, 20.47it/s]
 90%|█████████ | 360/400 [00:17<00:01, 20.48it/s]
 91%|█████████ | 363/400 [00:17<00:01, 20.48it/s]
 92%|█████████▏| 366/400 [00:17<00:01, 20.48it/s]
 92%|█████████▏| 369/400 [00:17<00:01, 20.48it/s]
 93%|█████████▎| 372/400 [00:17<00:01, 20.48it/s]
 94%|█████████▍| 375/400 [00:18<00:01, 20.49it/s]
 94%|█████████▍| 378/400 [00:18<00:01, 20.49it/s]
 95%|█████████▌| 381/400 [00:18<00:00, 20.49it/s]
 96%|█████████▌| 384/400 [00:18<00:00, 20.49it/s]
 97%|█████████▋| 387/400 [00:18<00:00, 20.51it/s]
 98%|█████████▊| 390/400 [00:18<00:00, 20.49it/s]
 98%|█████████▊| 393/400 [00:18<00:00, 20.48it/s]
 99%|█████████▉| 396/400 [00:19<00:00, 20.48it/s]
100%|█████████▉| 399/400 [00:19<00:00, 20.48it/s]
100%|██████████| 400/400 [00:19<00:00, 20.69it/s]
pretty_print_results(np.array(collected_l2_distances))
- p10: 0.988
- p5: 0.965
- p3: 0.897
- p1: 0.327
- Euc. Dist: 1.823

8.3 Conversion to Akida

The quantized model can be easily converted to Akida using the cnn2snn package. The convert function returns a model in Akida format ready for inference.

from cnn2snn import convert

akida_model = convert(model_quant.model)
akida_model.summary()
                 Model Summary
_______________________________________________
Input shape   Output shape  Sequences  Layers
===============================================
[96, 128, 2]  [3, 4, 3]     1          19
_______________________________________________

_________________________________________________________________________________________________
Layer (type)                                                    Output shape  Kernel shape

================= SW/ec92b4a7-5b2a-468c-b56e-70865292c4ef-dequantizer (Software) ================

ec92b4a7-5b2a-468c-b56e-70865292c4ef (BufferTempConv)           [96, 128, 8]  (1, 1, 10, 8)
_________________________________________________________________________________________________
node_Conv_0 (Conv2D)                                            [48, 64, 16]  (3, 3, 8, 16)
_________________________________________________________________________________________________
45058267-823c-4595-bab2-5cfa351c743f (BufferTempConv)           [48, 64, 32]  (1, 1, 80, 32)
_________________________________________________________________________________________________
node_Conv_1 (Conv2D)                                            [24, 32, 48]  (3, 3, 32, 48)
_________________________________________________________________________________________________
11d2f8c7-ce4d-466c-9aef-83a6b98af5e5 (BufferTempConv)           [24, 32, 64]  (1, 1, 240, 64)
_________________________________________________________________________________________________
node_Conv_2 (Conv2D)                                            [12, 16, 80]  (3, 3, 64, 80)
_________________________________________________________________________________________________
9152ed94-2122-47d4-aeb8-31a79f981dbd (DepthwiseBufferTempConv)  [12, 16, 80]  (1, 1, 5, 80)
_________________________________________________________________________________________________
node_Conv_3 (Conv2D)                                            [12, 16, 96]  (1, 1, 80, 96)
_________________________________________________________________________________________________
node_Conv_4 (DepthwiseConv2D)                                   [6, 8, 96]    (3, 3, 96, 1)
_________________________________________________________________________________________________
node_Conv_5 (Conv2D)                                            [6, 8, 112]   (1, 1, 96, 112)
_________________________________________________________________________________________________
c2903284-97a5-4666-99c3-4f408af17d1a (DepthwiseBufferTempConv)  [6, 8, 112]   (1, 1, 5, 112)
_________________________________________________________________________________________________
node_Conv_6 (Conv2D)                                            [6, 8, 128]   (1, 1, 112, 128)
_________________________________________________________________________________________________
node_Conv_7 (DepthwiseConv2D)                                   [3, 4, 128]   (3, 3, 128, 1)
_________________________________________________________________________________________________
node_Conv_9 (Conv2D)                                            [3, 4, 256]   (1, 1, 128, 256)
_________________________________________________________________________________________________
16397811-68f3-4ced-8708-4b3bdf46000b (BufferTempConv)           [3, 4, 256]   (1, 1, 1280, 256)
_________________________________________________________________________________________________
node_Conv_10 (Conv2D)                                           [3, 4, 256]   (3, 3, 256, 256)
_________________________________________________________________________________________________
node_Conv_11 (Conv2D)                                           [3, 4, 3]     (1, 1, 256, 3)
_________________________________________________________________________________________________
dequantizer (Dequantizer)                                       [3, 4, 3]     N/A
_________________________________________________________________________________________________

Note

  • For more information you can refer to the paper available here.

  • There is also a full training pipeline available in tensorflow/Keras from the akida_models package that reproduces the performance presented in the paper available with the akida_models.tenn_spatiotemporal function.

Total running time of the script: (8 minutes 1.634 seconds)

Gallery generated by Sphinx-Gallery