class_docstr: Encoding node and edge features
  
  Args:
      dim_in (int): Input feature dimension
code: def __init__(self, dim_in):
      super(FeatureEncoder, self).__init__()
      self.dim_in = dim_in
      if cfg.dataset.node_encoder:
          # Encode integer node features via nn.Embeddings
          NodeEncoder = node_encoder_dict[cfg.dataset.node_encoder_name]
          self.node_encoder = NodeEncoder(cfg.gnn.dim_inner)
          if cfg.dataset.node_encoder_bn:
              self.node_encoder_bn = BatchNorm1dNode(cfg.gnn.dim_inner)
          # Update dim_in to reflect the new dimension fo the node features
          self.dim_in = cfg.gnn.dim_inner
      if cfg.dataset.edge_encoder:
          # Encode integer edge features via nn.Embeddings
          EdgeEncoder = edge_encoder_dict[cfg.dataset.edge_encoder_name]
          self.edge_encoder = EdgeEncoder(cfg.gnn.dim_inner)
          if cfg.dataset.edge_encoder_bn:
              self.edge_encoder_bn = BatchNorm1dEdge(cfg.gnn.dim_inner)
  
imports: import torch
  import torch.nn
  import torch.nn.functional
  import graphgym.register
  from graphgym.config import cfg
  from graphgym.init import init_weights
  from graphgym.models.feature_encoder_pyg import edge_encoder_dict, node_encoder_dict
  from graphgym.models.head_pyg import head_dict
  from graphgym.models.layer_pyg import BatchNorm1dEdge, BatchNorm1dNode, GeneralLayer, GeneralMultiLayer
label_desc: Use image node_id 1 to create a new FeatureEncoder object from inherited base classes: nn with example: obj = FeatureEncoder(dim_in)