class_docstr: Example of a TFModelV2 that is built w/o using tf.keras.
  
  NOTE: The above keras-based example model does not work with PPO (due to
  a bug in keras related to missing values for input placeholders, even
  though these input values have been provided in a forward pass through the
  actual keras Model).
  
  All Model logic (layers) is defined in the `forward` method (incl.
  the batch_normalization layers). Also, all variables are registered
  (only once) at the end of `forward`, so an optimizer knows which tensors
  to train on. A standard `value_function` override is used.
code: def __init__(
      self, obs_space, action_space, num_outputs, model_config, name
  ):
      super().__init__(
          obs_space, action_space, num_outputs, model_config, name
      )
      # Have we registered our vars yet (see `forward`)?
      self._registered = False
  
imports: import numpy
  from ray.rllib.models.modelv2 import ModelV2
  from ray.rllib.models.tf.misc import normc_initializer
  from ray.rllib.models.tf.tf_modelv2 import TFModelV2
  from ray.rllib.models.torch.misc import SlimFC, normc_initializer
  from ray.rllib.models.torch.torch_modelv2 import TorchModelV2
  from ray.rllib.policy.sample_batch import SampleBatch
  from ray.rllib.utils.annotations import override
  from ray.rllib.utils.framework import try_import_tf, try_import_torch
label_desc: Use image node_id 1 to create a new BatchNormModel object from inherited base classes: TFModelV2 with example: obj = BatchNormModel(obs_space, action_space, num_outputs, model_config, name)