class_docstr: Offline TFGridNetV2. Compared with TFGridNet, TFGridNetV2 speeds up the code
      by vectorizing multiple heads in self-attention, and better dealing with
      Deconv1D in each intra- and inter-block when emb_ks == emb_hs.
  
  Reference:
  [1] Z.-Q. Wang, S. Cornell, S. Choi, Y. Lee, B.-Y. Kim, and S. Watanabe,
  "TF-GridNet: Integrating Full- and Sub-Band Modeling for Speech Separation",
  in TASLP, 2023.
  [2] Z.-Q. Wang, S. Cornell, S. Choi, Y. Lee, B.-Y. Kim, and S. Watanabe,
  "TF-GridNet: Making Time-Frequency Domain Models Great Again for Monaural
  Speaker Separation", in ICASSP, 2023.
  
  NOTES:
  As outlined in the Reference, this model works best when trained with variance
  normalized mixture input and target, e.g., with mixture of shape [batch, samples,
  microphones], you normalize it by dividing with torch.std(mixture, (1, 2)). You
  must do the same for the target signals. It is encouraged to do so when not using
  scale-invariant loss functions such as SI-SDR.
  Specifically, use:
      std_ = std(mix)
      mix = mix / std_
      tgt = tgt / std_
  
  Args:
      input_dim: placeholder, not used
      n_srcs: number of output sources/speakers.
      n_fft: stft window size.
      stride: stft stride.
      window: stft window type choose between 'hamming', 'hanning' or None.
      n_imics: number of microphones channels (only fixed-array geometry supported).
      n_layers: number of TFGridNetV2 blocks.
      lstm_hidden_units: number of hidden units in LSTM.
      attn_n_head: number of heads in self-attention
      attn_approx_qk_dim: approximate dimention of frame-level key and value tensors
      emb_dim: embedding dimension
      emb_ks: kernel size for unfolding and deconv1D
      emb_hs: hop size for unfolding and deconv1D
      activation: activation function to use in the whole TFGridNetV2 model,
          you can use any torch supported activation e.g. 'relu' or 'elu'.
      eps: small epsilon for normalization layers.
      use_builtin_complex: whether to use builtin complex type or not.
code: def pad2(input_tensor, target_len):
      input_tensor = torch.nn.functional.pad(
          input_tensor, (0, target_len - input_tensor.shape[-1])
      )
      return input_tensor
  
imports: import math
  from collections import OrderedDict
  from typing import Dict, List, Optional, Tuple
  import torch
  import torch.nn
  import torch.nn.functional
  from torch.nn import init
  from torch.nn.parameter import Parameter
  from espnet2.enh.decoder.stft_decoder import STFTDecoder
  from espnet2.enh.encoder.stft_encoder import STFTEncoder
  from espnet2.enh.layers.complex_utils import new_complex_like
  from espnet2.enh.separator.abs_separator import AbsSeparator
  from espnet2.torch_utils.get_layer_from_string import get_layer
label_desc: Use image node_id 4 for calling the TFGridNetV2 obj's underlying member method code with example usage: obj.pad2(input_tensor, target_len) and returns: input_tensor