class_docstr: Flatten and concatenation state value model.
  
  :param obs_shapes: Dictionary mapping of observation names to shapes.
  :param head_units: List of hidden units to use for the action/value head.
  :param non_lin: The non-linearity to apply.
class_docstr_tok: ["Flatten","and","concatenation","state","value","model",".",":","param","obs_shapes",":","Dictionary","mapping","of","observation","names","to","shapes",".",":","param","head_units",":","List","of","hidden","units","to","use","for","the","action\/value","head",".",":","param","non_lin",":","The","non-linearity","to","apply","."]
code: def __init__(
      self,
      obs_shapes: Dict[str, Sequence[int]],
      head_units: List[int],
      non_lin: nn.Module,
  ):
      super().__init__()
  
      self.perception_dict: Dict[str, PerceptionBlock] = dict()
      # build action head
  
      # build perception part
      self.perception_dict["head"] = DenseBlock(
          in_keys="latent",
          out_keys="head",
          in_shapes=obs_shapes["latent"],
          hidden_units=head_units,
          non_lin=non_lin,
      )
  
      self.perception_dict["value"] = LinearOutputBlock(
          in_keys="head",
          out_keys="value",
          in_shapes=self.perception_dict["head"].out_shapes(),
          output_units=1,
      )
  
      self.perception_dict["head"].apply(
          make_module_init_normc(std=1.0)
      )
      self.perception_dict["value"].apply(
          make_module_init_normc(std=0.01)
      )
  
      # compile inference model
      self.net = InferenceBlock(
          in_keys=list(obs_shapes.keys()),
          out_keys="value",
          in_shapes=list(obs_shapes.values()),
          perception_blocks=self.perception_dict,
      )
  
file_path: maze/maze/perception/models/built_in/flatten_concat_shared_embedding.py
imports: from typing import Sequence, Dict, List
  from torch import nn
  from maze.perception.blocks import PerceptionBlock
  from maze.perception.blocks.feed_forward.dense import DenseBlock
  from maze.perception.blocks.inference import InferenceBlock
  from maze.perception.blocks.output.linear import LinearOutputBlock
  from maze.perception.models.built_in.flatten_concat import FlattenConcatBaseNet
  from maze.perception.weight_init import make_module_init_normc
label_desc: Use image node_id 1 to create a new FlattenConcatSharedEmbeddingStateValueNet object from inherited base classes: nn with example: obj = FlattenConcatSharedEmbeddingStateValueNet(obs_shapes, head_units, non_lin)