class_docstr: Implements a multi-layer conv block.
class_docstr_tok: ["Implements","a","multi-layer","conv","block","."]
docstr: Builds a multi-layer convolution head.
  
  Args:
    x: Tokens in shape (batch_size, ..., num_frames, channels).
  
  Returns:
    Tensor in shape (batch_size, ..., num_frames, output_dim).
docstr_tok: ["Builds","a","multi-layer","convolution","head",".","Args",":","x",":","Tokens","in","shape","(","batch_size",",","...",",","num_frames",",","channels",")",".","Returns",":","Tensor","in","shape","(","batch_size",",","...",",","num_frames",",","output_dim",")","."]
code: def __call__(self, x: jnp.ndarray) -> jnp.ndarray:
      """Builds a multi-layer convolution head.
  
      Args:
        x: Tokens in shape (batch_size, ..., num_frames, channels).
  
      Returns:
        Tensor in shape (batch_size, ..., num_frames, output_dim).
      """
      channels = x.shape[-1]
      for idx in range(self.num_conv_layers):
          x = nn.LayerNorm(name=f"ln{idx}")(x)
          x = nn.Conv(channels, [self.kernel_size], name=f"conv{idx}")(
              x
          )
          x = nn.relu(x)
      output = nn.Dense(
          self.output_dim,
          kernel_init=nn.initializers.xavier_normal(),
          bias_init=jax.nn.initializers.constant(self.init_proj_bias),
          name="output_projection",
      )(x)
      return output
  
imports: from typing import List, Optional, Tuple
  import flax.linen
  import jax
  import jax.numpy
  import ml_collections
  from scenic.projects.unloc import model_utils
label_desc: Use image node_id 1 for calling the ConvBlock obj's underlying member method code with example usage: obj.__call__(x) and returns: output