<br />

|---|---|---|---|---|
| [![](https://www.tensorflow.org/images/tf_logo_32px.png)View on TensorFlow.org](https://www.tensorflow.org/hub/tutorials/movinet) | [![](https://www.tensorflow.org/images/colab_logo_32px.png)Run in Google Colab](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/hub/tutorials/movinet.ipynb) | [![](https://www.tensorflow.org/images/GitHub-Mark-32px.png)View on GitHub](https://github.com/tensorflow/docs/blob/master/site/en/hub/tutorials/movinet.ipynb) | [![](https://www.tensorflow.org/images/download_logo_32px.png)Download notebook](https://storage.googleapis.com/tensorflow_docs/docs/site/en/hub/tutorials/movinet.ipynb) | [![](https://www.tensorflow.org/images/hub_logo_32px.png)See TF Hub models](https://tfhub.dev/google/collections/movinet/1) |

This tutorial demonstrates how to use a pretrained video classification model to classify an activity (such as dancing, swimming, biking etc) in the given video.

The model architecture used in this tutorial is called [MoViNet](https://arxiv.org/pdf/2103.11511.pdf) (Mobile Video Networks). MoVieNets are a family of efficient video classification models trained on huge dataset ([Kinetics 600](https://deepmind.com/research/open-source/kinetics)).

In contrast to the [i3d models](https://tfhub.dev/s?q=i3d-kinetics) available on TF Hub, MoViNets also support frame-by-frame inference on streaming video.

The pretrained models are available from [TF Hub](https://tfhub.dev/google/collections/movinet/1). The TF Hub collection also includes quantized models optimized for [TFLite](https://tensorflow.org/lite).

The source for these models is available in the [TensorFlow Model Garden](https://github.com/tensorflow/models/tree/master/official/projects/movinet). This includes a [longer version of this tutorial](https://colab.sandbox.google.com/github/tensorflow/models/blob/master/official/projects/movinet/movinet_tutorial.ipynb) that also covers building and fine-tuning a MoViNet model.

This MoViNet tutorial is part of a series of TensorFlow video tutorials. Here are the other three tutorials:

- [Load video data](https://www.tensorflow.org/tutorials/load_data/video): This tutorial explains how to load and preprocess video data into a TensorFlow dataset pipeline from scratch.
- [Build a 3D CNN model for video classification](https://www.tensorflow.org/tutorials/video/video_classification). Note that this tutorial uses a (2+1)D CNN that decomposes the spatial and temporal aspects of 3D data; if you are using volumetric data such as an MRI scan, consider using a 3D CNN instead of a (2+1)D CNN.
- [Transfer learning for video classification with MoViNet](https://www.tensorflow.org/tutorials/video/transfer_learning_with_movinet): This tutorial explains how to use a pre-trained video classification model trained on a different dataset with the UCF-101 dataset.

![jumping jacks plot](https://storage.googleapis.com/tf_model_garden/vision/movinet/artifacts/jumpingjacks_plot.gif)

## Setup

For inference on smaller models (A0-A2), CPU is sufficient for this Colab.

    sudo apt install -y ffmpeg
    pip install -q mediapy

    pip uninstall -q -y opencv-python-headless
    pip install -q opencv-python-headless

    # Import libraries
    import pathlib

    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import mediapy as media
    import numpy as np
    import PIL

    import tensorflow as tf
    import tensorflow_hub as hub
    import tqdm

    mpl.rcParams.update({
        'font.size': 10,
    })

```
/tmpfs/src/tf_docs_env/lib/python3.11/site-packages/tensorflow_hub/__init__.py:61: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.
  from pkg_resources import parse_version
```

Get the kinetics 600 label list, and print the first few labels:

    labels_path = tf.keras.utils.get_file(
        fname='labels.txt',
        origin='https://raw.githubusercontent.com/tensorflow/models/f8af2291cced43fc9f1d9b41ddbf772ae7b0d7d2/official/projects/movinet/files/kinetics_600_labels.txt'
    )
    labels_path = pathlib.Path(labels_path)

    lines = labels_path.read_text().splitlines()
    KINETICS_600_LABELS = np.array([line.strip() for line in lines])
    KINETICS_600_LABELS[:20]

```
Downloading data from https://raw.githubusercontent.com/tensorflow/models/f8af2291cced43fc9f1d9b41ddbf772ae7b0d7d2/official/projects/movinet/files/kinetics_600_labels.txt
9209/9209 [==============================] - 0s 0us/step
array(['abseiling', 'acting in play', 'adjusting glasses', 'air drumming',
       'alligator wrestling', 'answering questions', 'applauding',
       'applying cream', 'archaeological excavation', 'archery',
       'arguing', 'arm wrestling', 'arranging flowers',
       'assembling bicycle', 'assembling computer',
       'attending conference', 'auctioning', 'backflip (human)',
       'baking cookies', 'bandaging'], dtype='<U49')
```

To provide a simple example video for classification, we can load a short gif of jumping jacks being performed.

![jumping jacks](https://github.com/tensorflow/models/raw/f8af2291cced43fc9f1d9b41ddbf772ae7b0d7d2/official/projects/movinet/files/jumpingjack.gif)

Attribution: Footage shared by [Coach Bobby Bluford](https://www.youtube.com/watch?v=-AxHpj-EuPg) on YouTube under the CC-BY license.

Download the gif.

    jumpingjack_url = 'https://github.com/tensorflow/models/raw/f8af2291cced43fc9f1d9b41ddbf772ae7b0d7d2/official/projects/movinet/files/jumpingjack.gif'
    jumpingjack_path = tf.keras.utils.get_file(
        fname='jumpingjack.gif',
        origin=jumpingjack_url,
        cache_dir='.', cache_subdir='.',
    )

```
Downloading data from https://github.com/tensorflow/models/raw/f8af2291cced43fc9f1d9b41ddbf772ae7b0d7d2/official/projects/movinet/files/jumpingjack.gif
783318/783318 [==============================] - 0s 0us/step
```

Define a function to read a gif file into a [`tf.Tensor`](https://www.tensorflow.org/api_docs/python/tf/Tensor):

<br />

<button type="button" class="button-red button expand-control">Toggle code</button>

<br />

    # Read and process a video
    def load_gif(file_path, image_size=(224, 224)):
      """Loads a gif file into a TF tensor.

      Use images resized to match what's expected by your model.
      The model pages say the "A2" models expect 224 x 224 images at 5 fps

      Args:
        file_path: path to the location of a gif file.
        image_size: a tuple of target size.

      Returns:
        a video of the gif file
      """
      # Load a gif file, convert it to a TF tensor
      raw = tf.io.read_file(file_path)
      video = tf.io.decode_gif(raw)
      # Resize the video
      video = tf.image.resize(video, image_size)
      # change dtype to a float32
      # Hub models always want images normalized to [0,1]
      # ref: https://www.tensorflow.org/hub/common_signatures/images#input
      video = tf.cast(video, tf.float32) / 255.
      return video

<br />

<br />

The video's shape is `(frames, height, width, colors)`

    jumpingjack=load_gif(jumpingjack_path)
    jumpingjack.shape

```
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1793882953.844655   65003 cuda_platform.cc:52] failed call to cuInit: INTERNAL: CUDA error: Failed call to cuInit: CUDA_ERROR_NO_DEVICE: no CUDA-capable device is detected
TensorShape([13, 224, 224, 3])
```

## How to use the model

This section contains a walkthrough showing how to use the [models from TensorFlow Hub](https://tfhub.dev/google/collections/movinet/1). If you just want to see the models in action, skip to the next section.

There are two versions of each model: `base` and `streaming`.

- The `base` version takes a video as input, and returns the probabilities averaged over the frames.
- The `streaming` version takes a video frame and an RNN state as input, and returns the predictions for that frame, and the new RNN state.

### The base model

Download the [pretrained model from TensorFlow Hub](https://tfhub.dev/tensorflow/movinet/a2/base/kinetics-600/classification/3).

    %%time
    id = 'a2'
    mode = 'base'
    version = '3'
    hub_url = f'https://tfhub.dev/tensorflow/movinet/{id}/{mode}/kinetics-600/classification/{version}'
    model = hub.load(hub_url)

```
CPU times: user 13.7 s, sys: 512 ms, total: 14.2 s
Wall time: 14.8 s
```

This version of the model has one `signature`. It takes an `image` argument which is a [`tf.float32`](https://www.tensorflow.org/api_docs/python/tf#float32) with shape `(batch, frames, height, width, colors)`. It returns a dictionary containing one output: A [`tf.float32`](https://www.tensorflow.org/api_docs/python/tf#float32) tensor of logits with shape `(batch, classes)`.

    sig = model.signatures['serving_default']
    print(sig.pretty_printed_signature())

```
Input Parameters:
  image (KEYWORD_ONLY): TensorSpec(shape=(None, None, None, None, 3), dtype=tf.float32, name='image')
Output Type:
  Dict[['classifier_head', TensorSpec(shape=(None, 600), dtype=tf.float32, name='classifier_head')]]
Captures:
  140010024598416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657444496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657444304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657443920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657444112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024598032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657443728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657443152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657443344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657443536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024598224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024597648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024597456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024597264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024597072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024597840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657441808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657441616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657442192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024596688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024596880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932972496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932972688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932973072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932972880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024596496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657440848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657441040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657441424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657441232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024596304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657440080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657440656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657440464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657440272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024595920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024595728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024595536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024595344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024596112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657439696: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657439504: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657439312: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657439888: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024595152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657438928: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657438736: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657439120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657438544: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657437968: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657437776: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657438352: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657438160: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024593808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024594576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657322832: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657322640: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657322448: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657322256: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024593616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024593424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657322064: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657321872: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657321680: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657321488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024593232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657320912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657320720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657321296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657321104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024592848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024592656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024592464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024592272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024593040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657320144: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657319952: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657320528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657320336: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024591888: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024592080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932973264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932973840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932973456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932973648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024590736: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657319568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657319376: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657319184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657319760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024590544: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024591696: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024591504: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024591312: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024591120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024590352: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657317648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657318032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657317840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024590928: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024590160: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657316880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657317456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657317264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657317072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589968: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657316496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657316304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657316112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657316688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589584: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589392: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589200: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589008: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024589776: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657315536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657315344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657315920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657315728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024588816: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024588624: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657315152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024588432: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657314000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657313808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024588048: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024587856: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024587664: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024587472: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024588240: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657313424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657313232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657313040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657313616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024587280: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024587088: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657312464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657312272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657312848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657312656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024586896: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657311696: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657311504: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657312080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657311888: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024586512: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024586320: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024586128: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024585936: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024586704: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657311312: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657311120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657310928: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657310736: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024585744: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024585552: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657310352: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657310160: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309968: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657310544: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024585360: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309392: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309200: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309776: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309584: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584976: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584784: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584592: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584400: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024585168: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657308432: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657309008: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657308816: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657308624: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584016: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024584208: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932974032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932974608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932974224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932974416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024583824: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657308048: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657307856: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657307664: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657308240: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024583632: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657307088: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657306896: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657307472: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657307280: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024583248: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657503056: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657502864: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657502672: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024583440: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657306704: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021830480: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021830288: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021830096: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657502480: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657502288: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021829904: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021829712: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021829520: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021829328: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657502096: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021828944: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021828752: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021828560: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021829136: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657501712: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657501520: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657501328: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657501136: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657501904: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827984: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827792: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021828368: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021828176: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657500944: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657500752: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827216: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827024: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827600: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021827408: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657500560: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021826832: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021826640: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021826448: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021826256: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657500176: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499984: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499792: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499600: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657500368: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021825872: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021825680: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021825488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021826064: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499408: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499216: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021824912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021824720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021825296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021825104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657499024: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021823952: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021824528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021824336: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021824144: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657498640: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657498448: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657498256: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657498064: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657498832: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021823760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021823568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021823376: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021823184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657497872: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657496720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657496528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021821840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021821648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021822032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657497680: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657497488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657497296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657497104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657496336: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021821456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021821264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021821072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021820880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657496912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657496144: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021820688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021820496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021820304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021820112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657495952: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021819728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021819536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021819344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021819920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657495568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657495376: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657495184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657495760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021819152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021817808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021818192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021817616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021817424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021817232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021817040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657493648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657493456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657493840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657494224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021816656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021816464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021816272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021816848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657493264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657493072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021815696: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021815504: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021816080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021815888: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657492880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021814736: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021815312: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021815120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021814928: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657492496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657492304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657492112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657491920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657492688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021814544: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021814352: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021961552: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021961360: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657491728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657491536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960976: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960784: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960592: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021961168: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657491344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960016: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021959824: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960400: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021960208: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657491152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021959632: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021959440: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021959248: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021959056: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657490000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021958864: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021958672: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021958480: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021958288: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657489808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021957904: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021957712: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021957520: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021958096: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657489424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657489232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657489040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657488848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657489616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021956944: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021956752: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021957328: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021957136: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657488656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657488464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021956176: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955984: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021956560: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021956368: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657488272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955792: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955600: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955408: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955216: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657487888: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657487696: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657487504: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657487312: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657488080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021954832: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021954640: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021954448: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021955024: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657486928: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657487120: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932975568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932975760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932974800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932975184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657453904: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021953680: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021954256: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021954064: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021953872: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657453712: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021953488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021953296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021953104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021952912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657453328: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657453136: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657452944: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657452752: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657453520: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021952528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021952336: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021952144: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021952720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657452560: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657452368: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021951568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021951376: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021951952: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021951760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657452176: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021951184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451792: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451600: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451408: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451216: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451984: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021950032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021949840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657451024: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657449680: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021949456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021949264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021949072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021949648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657449488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021948496: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021948304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021948880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021948688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657450640: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657450448: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657450256: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657450064: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657450832: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021948112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021947920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021947728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021947536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657449872: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657449296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021947344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021947152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657449104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021946576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657448720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657448528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657448336: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657448144: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657448912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932977488: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021945808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021945616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010021945424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657447952: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657447760: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932976720: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932977296: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932977104: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932976912: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657447568: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932976528: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932968080: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932968272: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932968464: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657447184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446608: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657447376: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932968848: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932969040: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932969232: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932968656: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446416: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446224: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932969808: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970000: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932969424: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932969616: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657446032: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970192: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970384: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970576: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970768: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657445648: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657445456: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657445264: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657445072: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657445840: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932970960: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932971152: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932971344: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932971536: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657444880: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140014657444688: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932971920: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932972112: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932972304: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010932971728: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024599184: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024598992: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024598800: TensorSpec(shape=(), dtype=tf.resource, name=None)
  140010024598608: TensorSpec(shape=(), dtype=tf.resource, name=None)
```

To run this signature on the video you need to add the outer `batch` dimension to the video first.

    #warmup
    sig(image = jumpingjack[tf.newaxis, :1]);

    %%time
    logits = sig(image = jumpingjack[tf.newaxis, ...])
    logits = logits['classifier_head'][0]

    print(logits.shape)
    print()

```
(600,)

CPU times: user 20.7 s, sys: 339 ms, total: 21 s
Wall time: 11.7 s
```

Define a `get_top_k` function that packages the above output processing for later.

<br />

<button type="button" class="button-red button expand-control">Toggle code</button>

<br />

    # Get top_k labels and probabilities
    def get_top_k(probs, k=5, label_map=KINETICS_600_LABELS):
      """Outputs the top k model labels and probabilities on the given video.

      Args:
        probs: probability tensor of shape (num_frames, num_classes) that represents
          the probability of each class on each frame.
        k: the number of top predictions to select.
        label_map: a list of labels to map logit indices to label strings.

      Returns:
        a tuple of the top-k labels and probabilities.
      """
      # Sort predictions to find top_k
      top_predictions = tf.argsort(probs, axis=-1, direction='DESCENDING')[:k]
      # collect the labels of top_k predictions
      top_labels = tf.gather(label_map, top_predictions, axis=-1)
      # decode lablels
      top_labels = [label.decode('utf8') for label in top_labels.numpy()]
      # top_k probabilities of the predictions
      top_probs = tf.gather(probs, top_predictions, axis=-1).numpy()
      return tuple(zip(top_labels, top_probs))

<br />

<br />

Convert the `logits` to probabilities, and look up the top 5 classes for the video. The model confirms that the video is probably of `jumping jacks`.

    probs = tf.nn.softmax(logits, axis=-1)
    for label, p in get_top_k(probs):
      print(f'{label:20s}: {p:.3f}')

```
jumping jacks       : 0.834
zumba               : 0.008
lunge               : 0.003
doing aerobics      : 0.003
polishing metal     : 0.002
```

### The streaming model

The previous section used a model that runs over a whole video. Often when processing a video you don't want a single prediction at the end, you want to update predictions frame by frame. The `stream` versions of the model allow you to do this.

Load the `stream` version of the model.

    %%time
    id = 'a2'
    mode = 'stream'
    version = '3'
    hub_url = f'https://tfhub.dev/tensorflow/movinet/{id}/{mode}/kinetics-600/classification/{version}'
    model = hub.load(hub_url)

```
WARNING:absl:`state/b1/l4/stream_buffer` is not a valid tf.function parameter name. Sanitizing to `state_b1_l4_stream_buffer`.
WARNING:absl:`state/b2/l3/stream_buffer` is not a valid tf.function parameter name. Sanitizing to `state_b2_l3_stream_buffer`.
WARNING:absl:`state/b2/l1/pool_buffer` is not a valid tf.function parameter name. Sanitizing to `state_b2_l1_pool_buffer`.
WARNING:absl:`state/b2/l1/stream_buffer` is not a valid tf.function parameter name. Sanitizing to `state_b2_l1_stream_buffer`.
WARNING:absl:`state/b3/l2/pool_buffer` is not a valid tf.function parameter name. Sanitizing to `state_b3_l2_pool_buffer`.
CPU times: user 37 s, sys: 1.74 s, total: 38.8 s
Wall time: 39.1 s
```

Using this model is slightly more complex than the `base` model. You have to keep track of the internal state of the model's RNNs.

    list(model.signatures.keys())

```
['call', 'init_states']
```

The `init_states` signature takes the video's **shape** `(batch, frames, height, width, colors)` as input, and returns a large dictionary of tensors containing the initial RNN states:

    lines = model.signatures['init_states'].pretty_printed_signature().splitlines()
    lines = lines[:10]
    lines.append('      ...')
    print('.\n'.join(lines))

```
Input Parameters:.
  input_shape (KEYWORD_ONLY): TensorSpec(shape=(5,), dtype=tf.int32, name='input_shape').
Output Type:.
  Dict[['state/b1/l4/stream_buffer', TensorSpec(shape=(None, 2, None, None, 120), dtype=tf.float32, name='state/b1/l4/stream_buffer')], ['state/b2/l3/stream_buffer', TensorSpec(shape=(None, 2, None, None, 192), dtype=tf.float32, name='state/b2/l3/stream_buffer')], ['state/b2/l1/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 160), dtype=tf.float32, name='state/b2/l1/pool_buffer')], ['state/b2/l1/stream_buffer', TensorSpec(shape=(None, 2, None, None, 160), dtype=tf.float32, name='state/b2/l1/stream_buffer')], ['state/b3/l2/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b3/l2/pool_buffer')], ['state/b2/l2/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b2/l2/pool_frame_count')], ['state/b3/l5/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b3/l5/stream_buffer')], ['state/b2/l1/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b2/l1/pool_frame_count')], ['state/b2/l3/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 192), dtype=tf.float32, name='state/b2/l3/pool_buffer')], ['state/b0/l2/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b0/l2/pool_frame_count')], ['state/b3/l2/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l2/pool_frame_count')], ['state/b0/l2/stream_buffer', TensorSpec(shape=(None, 2, None, None, 64), dtype=tf.float32, name='state/b0/l2/stream_buffer')], ['state/b0/l1/stream_buffer', TensorSpec(shape=(None, 2, None, None, 40), dtype=tf.float32, name='state/b0/l1/stream_buffer')], ['state/b1/l0/stream_buffer', TensorSpec(shape=(None, 2, None, None, 96), dtype=tf.float32, name='state/b1/l0/stream_buffer')], ['state/b3/l0/stream_buffer', TensorSpec(shape=(None, 4, None, None, 240), dtype=tf.float32, name='state/b3/l0/stream_buffer')], ['state/head/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/head/pool_frame_count')], ['state/b3/l3/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l3/pool_frame_count')], ['state/b0/l1/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b0/l1/pool_frame_count')], ['state/b4/l0/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 480), dtype=tf.float32, name='state/b4/l0/pool_buffer')], ['state/b3/l4/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l4/pool_frame_count')], ['state/b2/l4/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b2/l4/pool_frame_count')], ['state/b2/l0/stream_buffer', TensorSpec(shape=(None, 4, None, None, 240), dtype=tf.float32, name='state/b2/l0/stream_buffer')], ['state/b4/l2/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l2/pool_frame_count')], ['state/b2/l3/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b2/l3/pool_frame_count')], ['state/b3/l5/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l5/pool_frame_count')], ['state/b1/l0/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b1/l0/pool_frame_count')], ['state/b3/l1/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b3/l1/stream_buffer')], ['state/b1/l1/stream_buffer', TensorSpec(shape=(None, 2, None, None, 120), dtype=tf.float32, name='state/b1/l1/stream_buffer')], ['state/b1/l1/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 120), dtype=tf.float32, name='state/b1/l1/pool_buffer')], ['state/b1/l3/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 96), dtype=tf.float32, name='state/b1/l3/pool_buffer')], ['state/b0/l0/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 40), dtype=tf.float32, name='state/b0/l0/pool_buffer')], ['state/b4/l5/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l5/pool_frame_count')], ['state/b4/l0/stream_buffer', TensorSpec(shape=(None, 4, None, None, 480), dtype=tf.float32, name='state/b4/l0/stream_buffer')], ['state/b3/l2/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b3/l2/stream_buffer')], ['state/b2/l2/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b2/l2/stream_buffer')], ['state/b4/l2/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 384), dtype=tf.float32, name='state/b4/l2/pool_buffer')], ['state/b4/l5/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 480), dtype=tf.float32, name='state/b4/l5/pool_buffer')], ['state/b4/l4/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l4/pool_frame_count')], ['state/b1/l3/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b1/l3/pool_frame_count')], ['state/b4/l1/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 384), dtype=tf.float32, name='state/b4/l1/pool_buffer')], ['state/b3/l5/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b3/l5/pool_buffer')], ['state/head/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 640), dtype=tf.float32, name='state/head/pool_buffer')], ['state/b1/l0/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 96), dtype=tf.float32, name='state/b1/l0/pool_buffer')], ['state/b3/l0/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b3/l0/pool_buffer')], ['state/b1/l2/stream_buffer', TensorSpec(shape=(None, 2, None, None, 96), dtype=tf.float32, name='state/b1/l2/stream_buffer')], ['state/b2/l0/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b2/l0/pool_buffer')], ['state/b4/l4/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 480), dtype=tf.float32, name='state/b4/l4/pool_buffer')], ['state/b4/l6/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l6/pool_frame_count')], ['state/b1/l2/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 96), dtype=tf.float32, name='state/b1/l2/pool_buffer')], ['state/b4/l0/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l0/pool_frame_count')], ['state/b1/l3/stream_buffer', TensorSpec(shape=(None, 2, None, None, 96), dtype=tf.float32, name='state/b1/l3/stream_buffer')], ['state/b4/l5/stream_buffer', TensorSpec(shape=(None, 2, None, None, 480), dtype=tf.float32, name='state/b4/l5/stream_buffer')], ['state/b0/l2/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 64), dtype=tf.float32, name='state/b0/l2/pool_buffer')], ['state/b3/l1/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l1/pool_frame_count')], ['state/b3/l3/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b3/l3/pool_buffer')], ['state/b4/l3/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 480), dtype=tf.float32, name='state/b4/l3/pool_buffer')], ['state/b0/l1/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 40), dtype=tf.float32, name='state/b0/l1/pool_buffer')], ['state/b1/l4/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 120), dtype=tf.float32, name='state/b1/l4/pool_buffer')], ['state/b1/l2/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b1/l2/pool_frame_count')], ['state/b4/l6/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 576), dtype=tf.float32, name='state/b4/l6/pool_buffer')], ['state/b3/l4/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 144), dtype=tf.float32, name='state/b3/l4/pool_buffer')], ['state/b2/l4/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b2/l4/stream_buffer')], ['state/b2/l2/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b2/l2/pool_buffer')], ['state/b1/l1/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b1/l1/pool_frame_count')], ['state/b2/l0/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b2/l0/pool_frame_count')], ['state/b3/l0/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b3/l0/pool_frame_count')], ['state/b4/l3/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l3/pool_frame_count')], ['state/b0/l0/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b0/l0/pool_frame_count')], ['state/b2/l4/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b2/l4/pool_buffer')], ['state/b3/l3/stream_buffer', TensorSpec(shape=(None, 2, None, None, 240), dtype=tf.float32, name='state/b3/l3/stream_buffer')], ['state/b1/l4/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b1/l4/pool_frame_count')], ['state/b4/l1/pool_frame_count', TensorSpec(shape=(1,), dtype=tf.int32, name='state/b4/l1/pool_frame_count')], ['state/b3/l1/pool_buffer', TensorSpec(shape=(None, 1, 1, 1, 240), dtype=tf.float32, name='state/b3/l1/pool_buffer')]].
Captures:.
  None.
      ...
```

    initial_state = model.init_states(jumpingjack[tf.newaxis, ...].shape)

    type(initial_state)

```
dict
```

    list(sorted(initial_state.keys()))[:5]

```
['state/b0/l0/pool_buffer',
 'state/b0/l0/pool_frame_count',
 'state/b0/l1/pool_buffer',
 'state/b0/l1/pool_frame_count',
 'state/b0/l1/stream_buffer']
```

Once you have the initial state for the RNNs, you can pass the state and a video frame as input (keeping the `(batch, frames, height, width, colors)` shape for the video frame). The model returns a `(logits, state)` pair.

After just seeing the first frame, the model is not convinced that the video is of "jumping jacks":

    inputs = initial_state.copy()

    # Add the batch axis, take the first frme, but keep the frame-axis.
    inputs['image'] = jumpingjack[tf.newaxis, 0:1, ...]

    # warmup
    model(inputs);

    logits, new_state = model(inputs)
    logits = logits[0]
    probs = tf.nn.softmax(logits, axis=-1)

    for label, p in get_top_k(probs):
      print(f'{label:20s}: {p:.3f}')

    print()

```
golf chipping       : 0.427
tackling            : 0.134
lunge               : 0.056
stretching arm      : 0.053
passing american football (not in game): 0.039
```

If you run the model in a loop, passing the updated state with each frame, the model quickly converges to the correct result:

    %%time
    state = initial_state.copy()
    all_logits = []

    for n in range(len(jumpingjack)):
      inputs = state
      inputs['image'] = jumpingjack[tf.newaxis, n:n+1, ...]
      result, state = model(inputs)
      all_logits.append(logits)

    probabilities = tf.nn.softmax(all_logits, axis=-1)

```
CPU times: user 1.76 s, sys: 776 ms, total: 2.53 s
Wall time: 840 ms
```

    for label, p in get_top_k(probabilities[-1]):
      print(f'{label:20s}: {p:.3f}')

```
golf chipping       : 0.427
tackling            : 0.134
lunge               : 0.056
stretching arm      : 0.053
passing american football (not in game): 0.039
```

    id = tf.argmax(probabilities[-1])
    plt.plot(probabilities[:, id])
    plt.xlabel('Frame #')
    plt.ylabel(f"p('{KINETICS_600_LABELS[id]}')");

You may notice that the final probability is much more certain than in the previous section where you ran the `base` model. The `base` model returns an average of the predictions over the frames.

    for label, p in get_top_k(tf.reduce_mean(probabilities, axis=0)):
      print(f'{label:20s}: {p:.3f}')

```
golf chipping       : 0.427
tackling            : 0.134
lunge               : 0.056
stretching arm      : 0.053
passing american football (not in game): 0.039
```

![png](https://www.tensorflow.org/static/hub/tutorials/movinet_files/output_0Wij4tsyW8dR_1.png)

## Animate the predictions over time

The previous section went into some details about how to use these models. This section builds on top of that to produce some nice inference animations.

The hidden cell below to defines helper functions used in this section.

<br />

<button type="button" class="button-red button expand-control">Toggle code</button>

<br />

    # Get top_k labels and probabilities predicted using MoViNets streaming model
    def get_top_k_streaming_labels(probs, k=5, label_map=KINETICS_600_LABELS):
      """Returns the top-k labels over an entire video sequence.

      Args:
        probs: probability tensor of shape (num_frames, num_classes) that represents
          the probability of each class on each frame.
        k: the number of top predictions to select.
        label_map: a list of labels to map logit indices to label strings.

      Returns:
        a tuple of the top-k probabilities, labels, and logit indices
      """
      top_categories_last = tf.argsort(probs, -1, 'DESCENDING')[-1, :1]
      # Sort predictions to find top_k
      categories = tf.argsort(probs, -1, 'DESCENDING')[:, :k]
      categories = tf.reshape(categories, [-1])

      counts = sorted([
          (i.numpy(), tf.reduce_sum(tf.cast(categories == i, tf.int32)).numpy())
          for i in tf.unique(categories)[0]
      ], key=lambda x: x[1], reverse=True)

      top_probs_idx = tf.constant([i for i, _ in counts[:k]])
      top_probs_idx = tf.concat([top_categories_last, top_probs_idx], 0)
      # find unique indices of categories
      top_probs_idx = tf.unique(top_probs_idx)[0][:k+1]
      # top_k probabilities of the predictions
      top_probs = tf.gather(probs, top_probs_idx, axis=-1)
      top_probs = tf.transpose(top_probs, perm=(1, 0))
      # collect the labels of top_k predictions
      top_labels = tf.gather(label_map, top_probs_idx, axis=0)
      # decode the top_k labels
      top_labels = [label.decode('utf8') for label in top_labels.numpy()]

      return top_probs, top_labels, top_probs_idx

    # Plot top_k predictions at a given time step
    def plot_streaming_top_preds_at_step(
        top_probs,
        top_labels,
        step=None,
        image=None,
        legend_loc='lower left',
        duration_seconds=10,
        figure_height=500,
        playhead_scale=0.8,
        grid_alpha=0.3):
      """Generates a plot of the top video model predictions at a given time step.

      Args:
        top_probs: a tensor of shape (k, num_frames) representing the top-k
          probabilities over all frames.
        top_labels: a list of length k that represents the top-k label strings.
        step: the current time step in the range [0, num_frames].
        image: the image frame to display at the current time step.
        legend_loc: the placement location of the legend.
        duration_seconds: the total duration of the video.
        figure_height: the output figure height.
        playhead_scale: scale value for the playhead.
        grid_alpha: alpha value for the gridlines.

      Returns:
        A tuple of the output numpy image, figure, and axes.
      """
      # find number of top_k labels and frames in the video
      num_labels, num_frames = top_probs.shape
      if step is None:
        step = num_frames
      # Visualize frames and top_k probabilities of streaming video
      fig = plt.figure(figsize=(6.5, 7), dpi=300)
      gs = mpl.gridspec.GridSpec(8, 1)
      ax2 = plt.subplot(gs[:-3, :])
      ax = plt.subplot(gs[-3:, :])
      # display the frame
      if image is not None:
        ax2.imshow(image, interpolation='nearest')
        ax2.axis('off')
      # x-axis (frame number)
      preview_line_x = tf.linspace(0., duration_seconds, num_frames)
      # y-axis (top_k probabilities)
      preview_line_y = top_probs

      line_x = preview_line_x[:step+1]
      line_y = preview_line_y[:, :step+1]

      for i in range(num_labels):
        ax.plot(preview_line_x, preview_line_y[i], label=None, linewidth='1.5',
                linestyle=':', color='gray')
        ax.plot(line_x, line_y[i], label=top_labels[i], linewidth='2.0')


      ax.grid(which='major', linestyle=':', linewidth='1.0', alpha=grid_alpha)
      ax.grid(which='minor', linestyle=':', linewidth='0.5', alpha=grid_alpha)

      min_height = tf.reduce_min(top_probs) * playhead_scale
      max_height = tf.reduce_max(top_probs)
      ax.vlines(preview_line_x[step], min_height, max_height, colors='red')
      ax.scatter(preview_line_x[step], max_height, color='red')

      ax.legend(loc=legend_loc)

      plt.xlim(0, duration_seconds)
      plt.ylabel('Probability')
      plt.xlabel('Time (s)')
      plt.yscale('log')

      fig.tight_layout()
      fig.canvas.draw()

      data = np.asarray(fig.canvas.buffer_rgba(), dtype=np.uint8)[..., :3]
      plt.close()

      figure_width = int(figure_height * data.shape[1] / data.shape[0])
      image = PIL.Image.fromarray(data).resize([figure_width, figure_height])
      image = np.array(image)

      return image

    # Plotting top_k predictions from MoViNets streaming model
    def plot_streaming_top_preds(
        probs,
        video,
        top_k=5,
        video_fps=25.,
        figure_height=500,
        use_progbar=True):
      """Generates a video plot of the top video model predictions.

      Args:
        probs: probability tensor of shape (num_frames, num_classes) that represents
          the probability of each class on each frame.
        video: the video to display in the plot.
        top_k: the number of top predictions to select.
        video_fps: the input video fps.
        figure_fps: the output video fps.
        figure_height: the height of the output video.
        use_progbar: display a progress bar.

      Returns:
        A numpy array representing the output video.
      """
      # select number of frames per second
      video_fps = 8.
      # select height of the image
      figure_height = 500
      # number of time steps of the given video
      steps = video.shape[0]
      # estimate duration of the video (in seconds)
      duration = steps / video_fps
      # estimate top_k probabilities and corresponding labels
      top_probs, top_labels, _ = get_top_k_streaming_labels(probs, k=top_k)

      images = []
      step_generator = tqdm.trange(steps) if use_progbar else range(steps)
      for i in step_generator:
        image = plot_streaming_top_preds_at_step(
            top_probs=top_probs,
            top_labels=top_labels,
            step=i,
            image=video[i],
            duration_seconds=duration,
            figure_height=figure_height,
        )
        images.append(image)

      return np.array(images)

<br />

<br />

Start by running the streaming model across the frames of the video, and collecting the logits:

    init_states = model.init_states(jumpingjack[tf.newaxis].shape)

    # Insert your video clip here
    video = jumpingjack
    images = tf.split(video[tf.newaxis], video.shape[0], axis=1)

    all_logits = []

    # To run on a video, pass in one frame at a time
    states = init_states
    for image in tqdm.tqdm(images):
      # predictions for each frame
      logits, states = model({**states, 'image': image})
      all_logits.append(logits)

    # concatenating all the logits
    logits = tf.concat(all_logits, 0)
    # estimating probabilities
    probs = tf.nn.softmax(logits, axis=-1)

```
0%|          | 0/13 [00:00<?, ?it/s]
15%|█▌        | 2/13 [00:00<00:00, 15.48it/s]
31%|███       | 4/13 [00:00<00:00, 15.84it/s]
46%|████▌     | 6/13 [00:00<00:00, 16.12it/s]
62%|██████▏   | 8/13 [00:00<00:00, 16.18it/s]
77%|███████▋  | 10/13 [00:00<00:00, 16.17it/s]
92%|█████████▏| 12/13 [00:00<00:00, 16.11it/s]
100%|██████████| 13/13 [00:00<00:00, 16.06it/s]

```

    final_probs = probs[-1]
    print('Top_k predictions and their probablities\n')
    for label, p in get_top_k(final_probs):
      print(f'{label:20s}: {p:.3f}')

```
Top_k predictions and their probablities

jumping jacks       : 0.999
zumba               : 0.000
doing aerobics      : 0.000
dancing charleston  : 0.000
slacklining         : 0.000
```

Convert the sequence of probabilities into a video:

    # Generate a plot and output to a video tensor
    plot_video = plot_streaming_top_preds(probs, video, video_fps=8.)

```
0%|          | 0/13 [00:00<?, ?it/s]
8%|▊         | 1/13 [00:00<00:06,  1.85it/s]
15%|█▌        | 2/13 [00:00<00:05,  2.05it/s]
23%|██▎       | 3/13 [00:01<00:04,  2.11it/s]
31%|███       | 4/13 [00:03<00:09,  1.03s/it]
38%|███▊      | 5/13 [00:03<00:06,  1.22it/s]
46%|████▌     | 6/13 [00:04<00:04,  1.44it/s]
54%|█████▍    | 7/13 [00:04<00:03,  1.63it/s]
62%|██████▏   | 8/13 [00:05<00:02,  1.78it/s]
69%|██████▉   | 9/13 [00:05<00:02,  1.90it/s]
77%|███████▋  | 10/13 [00:06<00:01,  1.98it/s]
85%|████████▍ | 11/13 [00:06<00:00,  2.05it/s]
92%|█████████▏| 12/13 [00:06<00:00,  2.10it/s]
100%|██████████| 13/13 [00:07<00:00,  2.13it/s]
100%|██████████| 13/13 [00:07<00:00,  1.76it/s]

```

    # For gif format, set codec='gif'
    media.show_video(plot_video, fps=3)

Your browser does not support the video tag.

## Resources

The pretrained models are available from [TF Hub](https://tfhub.dev/google/collections/movinet/1). The TF Hub collection also includes quantized models optimized for [TFLite](https://tensorflow.org/lite).

The source for these models is available in the [TensorFlow Model Garden](https://github.com/tensorflow/models/tree/master/official/projects/movinet). This includes a [longer version of this tutorial](https://colab.sandbox.google.com/github/tensorflow/models/blob/master/official/projects/movinet/movinet_tutorial.ipynb) that also covers building and fine-tuning a MoViNet model.

## Next Steps

To learn more about working with video data in TensorFlow, check out the following tutorials:

- [Load video data](https://www.tensorflow.org/tutorials/load_data/video)
- [Build a 3D CNN model for video classification](https://www.tensorflow.org/tutorials/video/video_classification)
- [Transfer learning for video classification with MoViNet](https://www.tensorflow.org/tutorials/video/transfer_learning_with_movinet)