class_docstr: TCNDenseNet block from iNeuBe
  
  Reference:
  Lu, Y. J., Cornell, S., Chang, X., Zhang, W., Li, C., Ni, Z., ... & Watanabe, S.
  Towards Low-Distortion Multi-Channel Speech Enhancement:
  The ESPNET-Se Submission to the L3DAS22 Challenge. ICASSP 2022 p. 9201-9205.
  
  Args:
      n_spk: number of output sources/speakers.
      in_freqs: number of complex STFT frequencies.
      mic_channels: number of microphones channels
          (only fixed-array geometry supported).
      hid_chans: number of channels in the subsampling/upsampling conv layers.
      hid_chans_dense: number of channels in the densenet layers
          (reduce this to reduce VRAM requirements).
      ksz_dense: kernel size in the densenet layers thorough iNeuBe.
      ksz_tcn: kernel size in the TCN submodule.
      tcn_repeats: number of repetitions of blocks in the TCN submodule.
      tcn_blocks: number of blocks in the TCN submodule.
      tcn_channels: number of channels in the TCN submodule.
      activation: activation function to use in the whole iNeuBe model,
          you can use any torch supported activation e.g. 'relu' or 'elu'.
docstr: forward.
  
  Args:
      tf_rep (torch.Tensor): 4D tensor (multi-channel complex STFT of mixture)
                  of shape [B, T, C, F] batch, frames, microphones, frequencies.
  
  Returns:
      out (torch.Tensor): complex 3D tensor monaural STFT of the targets
          shape is [B, T, F] batch, frames, frequencies.
docstr_tok: ["forward",".","Args",":","tf_rep","(","torch.Tensor",")",":","4D","tensor","(","multi-channel","complex","STFT","of","mixture",")","of","shape","[","B",",","T",",","C",",","F","]","batch",",","frames",",","microphones",",","frequencies",".","Returns",":","out","(","torch.Tensor",")",":","complex","3D","tensor","monaural","STFT","of","the","targets","shape","is","[","B",",","T",",","F","]","batch",",","frames",",","frequencies","."]
code: def forward(self, tf_rep):
      """forward.
  
      Args:
          tf_rep (torch.Tensor): 4D tensor (multi-channel complex STFT of mixture)
                      of shape [B, T, C, F] batch, frames, microphones, frequencies.
  
      Returns:
          out (torch.Tensor): complex 3D tensor monaural STFT of the targets
              shape is [B, T, F] batch, frames, frequencies.
  
      """
      # B, T, C, F
      tf_rep = tf_rep.permute(0, 2, 3, 1)
      bsz, mics, _, frames = tf_rep.shape
      assert mics == self.mic_channels
  
      inp_feats = torch.cat((tf_rep.real, tf_rep.imag), 1)
      inp_feats = inp_feats.transpose(-1, -2)
      inp_feats = inp_feats.reshape(
          bsz, self.mic_channels * 2, frames, self.in_channels
      )
  
      enc_out = []
      buffer = inp_feats
      for enc_layer in self.encoder:
          buffer = enc_layer(buffer)
          enc_out.append(buffer)
  
      assert buffer.shape[-1] == 1
      tcn_out = self.tcn(buffer.squeeze(-1)).unsqueeze(-1)
  
      buffer = tcn_out
      for indx, dec_layer in enumerate(self.decoder):
          c_input = torch.cat((buffer, enc_out[-(indx + 1)]), 1)
          buffer = dec_layer(c_input)
  
      buffer = buffer.reshape(bsz, 2, self.n_spk, -1, self.in_channels)
  
      if is_torch_1_9_plus:
          out = torch.complex(buffer[:, 0], buffer[:, 1])
      else:
          out = ComplexTensor(buffer[:, 0], buffer[:, 1])
      # bsz, complex_chans, frames or bsz, spk, complex_chans, frames
      return out
  
imports: import torch
  from packaging.version import parse
  from torch_complex.tensor import ComplexTensor
  from espnet2.torch_utils.get_layer_from_string import get_layer
label_desc: Use image node_id 3 for calling the TCNDenseUNet obj's underlying member method code with example usage: obj.forward(tf_rep) and returns: out