class_docstr: An input embedder is the first part of the network, which takes the input from the state and produces a vector
  embedding by passing it through a neural network. The embedder will mostly be input type dependent, and there
  can be multiple embedders in a single network
class_docstr_tok: ["An","input","embedder","is","the","first","part","of","the","network",",","which","takes","the","input","from","the","state","and","produces","a","vector","embedding","by","passing","it","through","a","neural","network",".","The","embedder","will","mostly","be","input","type","dependent",",","and","there","can","be","multiple","embedders","in","a","single","network"]
docstr: Builds the graph of the module
  This method is called early on from __call__. It is expected to store the graph
  in self.output.
  :return: None
docstr_tok: ["Builds","the","graph","of","the","module","This","method","is","called","early","on","from","__call__",".","It","is","expected","to","store","the","graph","in","self.output",".",":","return",":","None"]
code: def _build_module(self) -> None:
      """
      Builds the graph of the module
      This method is called early on from __call__. It is expected to store the graph
      in self.output.
      :return: None
      """
      # NOTE: for image inputs, we expect the data format to be of type uint8, so to be memory efficient. we chose not
      #  to implement the rescaling as an input filters.observation.observation_filter, as this would have caused the
      #  input to the network to be float, which is 4x more expensive in memory.
      #  thus causing each saved transition in the memory to also be 4x more pricier.
  
      input_layer = self.input / self.input_rescaling
      input_layer -= self.input_offset
      # clip input using te given range
      if self.input_clipping is not None:
          input_layer = tf.clip_by_value(
              input_layer,
              self.input_clipping[0],
              self.input_clipping[1],
          )
  
      self.layers.append(input_layer)
  
      for idx, layer_params in enumerate(self.layers_params):
          self.layers.extend(
              force_list(
                  layer_params(
                      input_layer=self.layers[-1],
                      name="{}_{}".format(
                          layer_params.__class__.__name__, idx
                      ),
                      is_training=self.is_training,
                  )
              )
          )
  
      if self.flatten:
          self.output = Flatten()(self.layers[-1])
      else:
          self.output = self.layers[-1]
  
file_path: coach/rl_coach/architectures/tensorflow_components/embedders/embedder.py
imports: from typing import List, Union, Tuple
  import copy
  import numpy
  import tensorflow
  from rl_coach.architectures.tensorflow_components.layers import BatchnormActivationDropout, convert_layer, Dense, Flatten
  from rl_coach.base_parameters import EmbedderScheme, NetworkComponentParameters
  from rl_coach.core_types import InputEmbedding
  from rl_coach.utils import force_list
label_desc: Use image node_id 3 for calling the InputEmbedder obj's underlying member method code with example usage: obj._build_module() without return types