code: def test_Mlp(self):
      fake_input = torch.rand((8, 64))
      in_features = [10, 20, 30]
      hidden_features = [10, 20, 20]
      out_features = [10, 20, 30]
      act_layers = [nn.GELU, nn.ReLU, nn.Sigmoid]
      drop_rates = [0.0, 0.1, 0.5]
      batch_size = 8
      for (
          in_feat,
          hidden_feat,
          out_feat,
          act_layer,
          drop_rate,
      ) in itertools.product(
          in_features,
          hidden_features,
          out_features,
          act_layers,
          drop_rates,
      ):
          mlp_block = Mlp(
              in_features=in_feat,
              hidden_features=hidden_feat,
              out_features=out_feat,
              act_layer=act_layer,
              dropout_rate=drop_rate,
          )
          fake_input = torch.rand((batch_size, in_feat))
          output = mlp_block(fake_input)
          self.assertTrue(
              output.shape, torch.Size([batch_size, out_feat])
          )
  
file_path: pytorchvideo/tests/test_layers_attention.py
imports: import itertools
  import unittest
  import torch
  import torch.nn
  from pytorchvideo.layers import Mlp, MultiScaleAttention, MultiScaleBlock
label_desc: Use image node_id 4 for calling the TestMLP obj's underlying member method code with example usage: obj.test_Mlp() without return types