code: def test_feed_forward_conv_dense_block():
      """perception test"""
      in_dict = build_input_dict(dims=[100, 3, 64, 64])
      net: VGGConvolutionDenseBlock = VGGConvolutionDenseBlock(
          in_keys="in_key",
          out_keys="out_key",
          in_shapes=(3, 64, 64),
          hidden_channels=[4, 8, 16],
          hidden_units=[32, 32],
          non_lin=nn.ReLU,
      )
      str(net)
      out_dict = net(in_dict)
  
      assert isinstance(out_dict, Dict)
      assert set(net.out_keys).issubset(set(out_dict.keys()))
      assert out_dict[net.out_keys[0]].shape == (100, 32)
      assert net.out_shapes() == [out_dict[net.out_keys[0]].shape[-1:]]
  
file_path: maze/maze/test/perception/blocks/test_joint.py
imports: from typing import Dict
  from torch import nn
  from maze.perception.blocks.joint_blocks.flatten_dense import FlattenDenseBlock
  from maze.perception.blocks.joint_blocks.lstm_last_step import LSTMLastStepBlock
  from maze.perception.blocks.joint_blocks.vgg_conv_dense import VGGConvolutionDenseBlock
  from maze.perception.blocks.joint_blocks.vgg_conv_gap import VGGConvolutionGAPBlock
  from maze.test.perception.perception_test_utils import build_input_dict
label_desc: Use image node_id 2 for calling a global function with example usage: test_feed_forward_conv_dense_block() without return types