class_docstr: Flatten and concatenation state action value model.
  
  :param obs_shapes: Dictionary mapping of observation names to shapes.
  :param output_shapes: Dictionary mapping of output heads to shapes.
  :param hidden_units: Dictionary mapping of action names to shapes.
  :param non_lin: The non-linearity to apply.
code: def __init__(
      self,
      obs_shapes: Dict[str, Sequence[int]],
      output_shapes: Dict[str, Sequence[int]],
      hidden_units: List[int],
      non_lin: nn.Module,
  ):
      super().__init__(obs_shapes, hidden_units, non_lin)
  
      # build action head
      module_init = make_module_init_normc(std=0.01)
      for output_key, output_shape in output_shapes.items():
          self.perception_dict[output_key] = LinearOutputBlock(
              in_keys="latent",
              out_keys=output_key,
              in_shapes=self.perception_dict["latent"].out_shapes(),
              output_units=output_shape[-1],
          )
  
          self.perception_dict[output_key].apply(module_init)
  
      # compile inference model
      self.net = InferenceBlock(
          in_keys=list(obs_shapes.keys()),
          out_keys=list(output_shapes.keys()),
          in_shapes=list(obs_shapes.values()),
          perception_blocks=self.perception_dict,
      )
  
imports: from typing import Sequence, Dict, List, Tuple
  import torch
  from maze.perception.blocks.general.functional import FunctionalBlock
  from maze.train.trainers.common.value_transform import support_to_scalar
  from torch import nn
  from maze.perception.blocks import PerceptionBlock
  from maze.perception.blocks.feed_forward.dense import DenseBlock
  from maze.perception.blocks.general.concat import ConcatenationBlock
  from maze.perception.blocks.general.flatten import FlattenBlock
  from maze.perception.blocks.inference import InferenceBlock
  from maze.perception.blocks.output.linear import LinearOutputBlock
  from maze.perception.weight_init import make_module_init_normc
label_desc: Use image node_id 1 to create a new FlattenConcatStateActionValueNet object from inherited base classes: FlattenConcatBaseNet with example: obj = FlattenConcatStateActionValueNet(obs_shapes, output_shapes, hidden_units, non_lin)