class_docstr: MTV model.
docstr: Executes MTV model.
  
  Args:
    x: A 5D float tensor of shape (batch, time, height, width, channels)
      representing the input video.
    train: Whether or not it is in training.
    debug: Whether or not it is in debug mogde. Not used here.
  
  Returns:
    The logits produced by the MTV model.
docstr_tok: ["Executes","MTV","model",".","Args",":","x",":","A","5D","float","tensor","of","shape","(","batch",",","time",",","height",",","width",",","channels",")","representing","the","input","video",".","train",":","Whether","or","not","it","is","in","training",".","debug",":","Whether","or","not","it","is","in","debug","mogde",".","Not","used","here",".","Returns",":","The","logits","produced","by","the","MTV","model","."]
code: def __call__(
      self, x: jnp.ndarray, *, train: bool = True, debug: bool = False
  ):
      """Executes MTV model.
  
      Args:
        x: A 5D float tensor of shape (batch, time, height, width, channels)
          representing the input video.
        train: Whether or not it is in training.
        debug: Whether or not it is in debug mogde. Not used here.
  
      Returns:
        The logits produced by the MTV model.
      """
      del debug
      self._check_config(x)
      tokens = self._tokenize(x)
      tokens = self._add_cls_tokens_for_all_views(tokens)
      tokens = self._align_temporal_dimension_across_views(tokens)
      if (
          self.cross_view_fusion is not None
          and self.cross_view_fusion.type == "bottleneck"
      ):
          if self.cross_view_fusion.get(
              "fuse_in_descending_order", True
          ):
              channels = tokens[-1].shape[-1]
          else:
              channels = tokens[0].shape[-1]
          bottleneck = self.param(
              "bottleneck",
              nn.initializers.normal(stddev=0.02),
              (
                  1,
                  tokens[0].shape[1],
                  self.cross_view_fusion.bottleneck_tokens,
                  channels,
              ),
              self.dtype,
          )
          bottleneck = jnp.tile(bottleneck, [x.shape[0], 1, 1, 1])
          tokens = jax.vmap(
              functools.partial(self._encode_per_time, is_train=train),
              in_axes=(1, 1),
              out_axes=1,
          )(tokens, bottleneck)
      else:
          tokens = jax.vmap(
              functools.partial(
                  self._encode_per_time, bottleneck=None, is_train=train
              ),
              in_axes=1,
              out_axes=1,
          )(tokens)
      tokens = self._global_encode(tokens, train)
      if self.keep_spatiotemporal_features:
          bs, _, h, w, _ = x.shape
          tokens = tokens.reshape(
              (
                  bs,
                  tokens.shape[1],
                  h // self.view_configs[0].patches.size[0],
                  w // self.view_configs[0].patches.size[1],
                  -1,
              )
          )
      pre_logits = nn_layers.IdentityLayer(name="pre_logits")(tokens)
      if self.final_endpoint == "pre_logits":
          return pre_logits
      if self.keep_spatiotemporal_features:
          pre_logits = self._extract_encoder_output(pre_logits, axis=1)
      logits = nn.Dense(
          self.num_classes,
          kernel_init=nn.initializers.zeros,
          name="output_projection",
      )(pre_logits)
      if self.final_endpoint == "logits":
          return logits
      raise ValueError(
          f"Final endpoint `{self.final_endpoint}` not recognized."
      )
  
imports: import functools
  from typing import Any, List, Sequence, Tuple, Union
  import flax.linen
  import jax
  import jax.numpy
  import ml_collections
  from scenic.model_lib.layers import attention_layers
  from scenic.model_lib.layers import nn_layers
  from scenic.projects.baselines import vit
  from scenic.projects.mtv import model_utils
  from scenic.projects.vivit import model
  from scenic.train_lib import train_utils
label_desc: Use image node_id 12 for calling the MTV obj's underlying member method code with example usage: obj.__call__(x) and returns: pre_logits, logits