class_docstr: Encapsulates tensor normalization and owns normalization variables.
  
  Example usage:
  
  ```
  tensor_normalizer = StreamingTensorNormalizer(
      tf.TensorSpec([], tf.float32))
  observation_list = [list of float32 scalars or batches]
  normalized_list = []
  
  for o in observation_list:
    normalized_list.append(tensor_normalizer.normalize(o))
    tensor_normalizer.update(o)
  ```
  
  For float64 inputs do:
  ```
  tensor_normalizer = StreamingTensorNormalizer(
      tf.TensorSpec([], tf.float64), dtype=tf.float64)
  observation_list = [list of float64 scalars or batches]
  
  for o in observation_list:
    normalized_list.append(tensor_normalizer.normalize(o))
    tensor_normalizer.update(o)
docstr: Updates tensor normalizer variables.
docstr_tok: ["Updates","tensor","normalizer","variables","."]
code: def update(self, tensor, outer_dims=(0,)):
      """Updates tensor normalizer variables."""
      nest_utils.assert_matching_dtypes_and_inner_shapes(
          tensor,
          self._tensor_spec,
          caller=self,
          tensors_name="tensor",
          specs_name="tensor_spec",
      )
      tensor = tf.nest.map_structure(
          lambda t: tf.cast(t, self.map_dtype(t.dtype)), tensor
      )
  
      return tf.group(self._update_ops(tensor, outer_dims))
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import abc
  from typing import Tuple
  import six
  import tensorflow
  from tf_agents.specs import tensor_spec
  from tf_agents.typing import types
  from tf_agents.utils import common
  from tf_agents.utils import nest_utils
label_desc: Use image node_id 8 for calling the TensorNormalizer obj's underlying member method code with example usage: obj.update(tensor, outer_dims) and returns: tf