code: def test_feature_transformer(
      input_size: int,
      size: int,
      virtual_batch_size: Optional[int],
      num_total_blocks: int,
      num_shared_blocks: int,
      batch_size: int,
  ) -> None:
      # setup synthetic tensor
      torch.manual_seed(RANDOM_SEED)
      input_tensor = torch.randn(
          [batch_size, input_size], dtype=torch.float32
      )
  
      feature_transformer = FeatureTransformer(
          input_size,
          size,
          bn_virtual_bs=virtual_batch_size,
          num_total_blocks=num_total_blocks,
          num_shared_blocks=num_shared_blocks,
      )
  
      output_tensor = feature_transformer(input_tensor)
  
      # check for expected structure and properties
      assert isinstance(output_tensor, torch.Tensor)
      assert output_tensor.shape == (batch_size, size)
  
      assert feature_transformer.input_shape[-1] == input_size
      assert feature_transformer.output_shape[-1] == size
      assert feature_transformer.input_dtype == torch.float32
  
file_path: ludwig/tests/ludwig/modules/test_tabnet_modules.py
imports: from typing import Optional
  import pytest
  import torch
  from ludwig.modules.tabnet_modules import AttentiveTransformer, FeatureBlock, FeatureTransformer, TabNet
  from ludwig.utils.entmax import sparsemax
  from tests.integration_tests.parameter_update_utils import check_module_parameters_updated
label_desc: Use image node_id 3 for calling a global function with example usage: test_feature_transformer(input_size, size, virtual_batch_size, num_total_blocks, num_shared_blocks, batch_size) without return types