code: def test_mlp_and_concat():
      """perception test"""
  
      in_dict = build_multi_input_dict(dims=[[100, 1, 16], [100, 1, 8]])
  
      feat_dict = dict()
      for in_key, in_tensor in in_dict.items():
          # compile network block
          net = DenseBlock(
              in_keys=in_key,
              out_keys=f"{in_key}_feat",
              in_shapes=(in_tensor.shape[-1],),
              hidden_units=[32, 32],
              non_lin=nn.ReLU,
          )
  
          # update output dictionary
          feat_dict.update(net(in_dict))
  
      net = ConcatenationBlock(
          in_keys=list(feat_dict.keys()),
          out_keys="concat",
          in_shapes=[(32,), (32,)],
          concat_dim=-1,
      )
      out_dict = net(feat_dict)
      assert out_dict["concat"].ndim == 3
      assert out_dict["concat"].shape[-1] == 64
  
file_path: maze/maze/test/perception/blocks/test_general.py
imports: from typing import Dict
  import numpy
  import torch
  from torch import nn
  from maze.perception.blocks.feed_forward.dense import DenseBlock
  from maze.perception.blocks.general.action_masking import ActionMaskingBlock
  from maze.perception.blocks.general.concat import ConcatenationBlock
  from maze.perception.blocks.general.correlation import CorrelationBlock
  from maze.perception.blocks.general.flatten import FlattenBlock
  from maze.perception.blocks.general.gap import GlobalAveragePoolingBlock
  from maze.perception.blocks.general.slice import SliceBlock
  from maze.test.perception.perception_test_utils import build_multi_input_dict, build_input_dict
label_desc: Use image node_id 2 for calling a global function with example usage: test_mlp_and_concat() without return types