class_docstr: single DenseNet block as used in iNeuBe model.
  
  Args:
      in_channels: number of input channels (image axis).
      out_channels: number of output channels (image axis).
      num_freqs: number of complex frequencies in the
          input STFT complex image-like tensor.
          The input is batch, image_channels, frames, freqs.
      pre_blocks: dense block before point-wise convolution block over frequency axis.
      freq_proc_blocks: number of frequency axis processing blocks.
      post_blocks: dense block after point-wise convolution block over frequency axis.
      ksz: kernel size used in densenet Conv2D layers.
      activation: activation function to use in the whole iNeuBe model,
              you can use any torch supported activation e.g. 'relu' or 'elu'.
      hid_chans: number of hidden channels in densenet Conv2D.
code: def forward(self, input):
      # batch, channels, frames, freq
  
      out = [input]
      for pre_block in self.pre_blocks:
          c_out = pre_block(torch.cat(out, 1))
          out.append(c_out)
  
      for freq_block in self.freq_proc_blocks:
          c_out = freq_block(torch.cat(out, 1))
          out.append(c_out)
  
      for post_block in self.post_blocks:
          c_out = post_block(torch.cat(out, 1))
          out.append(c_out)
  
      return c_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 2 for calling the DenseBlock obj's underlying member method code with example usage: obj.forward(input) and returns: c_out