class_docstr: A linear output block holding a single linear layer.
  
  :param in_keys: One key identifying the input tensors.
  :param out_keys: One key identifying the output tensors.
  :param in_shapes: List of input shapes.
  :param output_units: Count of output units.
class_docstr_tok: ["A","linear","output","block","holding","a","single","linear","layer",".",":","param","in_keys",":","One","key","identifying","the","input","tensors",".",":","param","out_keys",":","One","key","identifying","the","output","tensors",".",":","param","in_shapes",":","List","of","input","shapes",".",":","param","output_units",":","Count","of","output","units","."]
docstr: implementation of :class:`~maze.perception.blocks.shape_normalization.ShapeNormalizationBlock` interface
          
docstr_tok: ["implementation","of",":","class",":","`","~maze.perception.blocks.shape_normalization.ShapeNormalizationBlock","`","interface"]
code: def normalized_forward(
      self, block_input: Dict[str, torch.Tensor]
  ) -> Dict[str, torch.Tensor]:
      """implementation of :class:`~maze.perception.blocks.shape_normalization.ShapeNormalizationBlock` interface"""
      # extract the input tensor of the first (and here only) input key
      input_tensor = block_input[self.in_keys[0]]
      # apply the linear layer
      output_tensor = self.net(input_tensor)
      # return the output tensor as a tensor dictionary
      return {self.out_keys[0]: output_tensor}
  
file_path: maze/docs/source/policy_and_value_networks/code_snippets/my_linear_block.py
imports: import builtins
  from typing import Union, List, Sequence, Dict
  import torch
  from torch import nn
  from maze.core.annotations import override
  from maze.perception.blocks.shape_normalization import ShapeNormalizationBlock
label_desc: Use image node_id 2 for calling the MyLinearBlock obj's underlying member method code with example usage: obj.normalized_forward(block_input) and returns: dict