code: def __init__(
      self,
      input_size: int,
      size: int,
      apply_glu: bool = True,
      bn_momentum: float = 0.1,
      bn_epsilon: float = 1e-3,
      bn_virtual_bs: int = None,
      shared_fc_layer: LudwigModule = None,
  ):
      super().__init__()
      self.input_size = input_size
      self.apply_glu = apply_glu
      self.size = size
      units = size * 2 if apply_glu else size
  
      # Initialize fc_layer before assigning to shared layer for torchscript compatibilty
      self.fc_layer = nn.Linear(input_size, units, bias=False)
      if shared_fc_layer is not None:
          assert (
              shared_fc_layer.weight.shape == self.fc_layer.weight.shape
          )
          self.fc_layer = shared_fc_layer
  
      self.batch_norm = GhostBatchNormalization(
          units,
          virtual_batch_size=bn_virtual_bs,
          momentum=bn_momentum,
          epsilon=bn_epsilon,
      )
  
imports: from typing import List, Optional, Tuple
  import torch
  import torch.nn
  from ludwig.modules.normalization_modules import GhostBatchNormalization
  from ludwig.utils.entmax import Entmax15, EntmaxBisect, Sparsemax
  from ludwig.utils.torch_utils import LudwigModule
label_desc: Use image node_id 1 to create a new FeatureBlock object from inherited base classes: LudwigModule with example: obj = FeatureBlock(input_size, size, apply_glu, bn_momentum, bn_epsilon, bn_virtual_bs, shared_fc_layer)