class_docstr: the Segment-LSTM of SkiM
  Note: This is taken from the SkiM implementation in ESPNet toolkit and modified for compatibility with SpeechBrain.
  
  Arguments:
  ----------
  input_size: int,
      dimension of the input feature.
      The input should have shape (batch, seq_len, input_size).
  hidden_size: int,
      dimension of the hidden state.
  dropout: float,
      dropout ratio. Default is 0.
  bidirectional: bool,
      whether the LSTM layers are bidirectional.
      Default is False.
  norm_type: gln, cln.
      This selects the type of normalization
      cln is for causal implementation.
  
  Example
  ---------
  >>> x = torch.randn(3, 20, 64)
  >>> hc = None
  >>> seglstm = SegLSTM(64, 64)
  >>> y = seglstm(x, hc)
  >>> y[0].shape
  torch.Size([3, 20, 64])
code: def __init__(
      self,
      input_size,
      hidden_size,
      dropout=0.0,
      bidirectional=False,
      norm_type="cLN",
  ):
      super().__init__()
  
      self.input_size = input_size
      self.hidden_size = hidden_size
      self.num_direction = int(bidirectional) + 1
  
      self.lstm = nn.LSTM(
          input_size,
          hidden_size,
          1,
          batch_first=True,
          bidirectional=bidirectional,
      )
      self.dropout = nn.Dropout(p=dropout)
      self.proj = nn.Linear(
          hidden_size * self.num_direction, input_size
      )
      self.norm = select_norm(
          norm=norm_type, dim=input_size, shape=3, eps=EPS
      )
  
imports: import torch
  import torch.nn
  from speechbrain.lobes.models.dual_path import select_norm
  from speechbrain.lobes.models.transformer.Transformer import TransformerEncoder, PositionalEncoding, get_lookahead_mask
  import speechbrain.nnet.RNN
  import copy
label_desc: Use image node_id 1 to create a new SegLSTM object from inherited base classes: nn with example: obj = SegLSTM(input_size, hidden_size, dropout, bidirectional, norm_type)