docstr: DC-CRN forward.
  
  Args:
      x (torch.Tensor): Concatenated real and imaginary spectrum features
          (B, input_channels[0], T, F)
  Returns:
      out (torch.Tensor): (B, 2, output_channels, T, F)
docstr_tok: ["DC-CRN","forward",".","Args",":","x","(","torch.Tensor",")",":","Concatenated","real","and","imaginary","spectrum","features","(","B",",","input_channels","[","0","]",",","T",",","F",")","Returns",":","out","(","torch.Tensor",")",":","(","B",",","2",",","output_channels",",","T",",","F",")"]
code: def forward(self, x):
      """DC-CRN forward.
  
      Args:
          x (torch.Tensor): Concatenated real and imaginary spectrum features
              (B, input_channels[0], T, F)
      Returns:
          out (torch.Tensor): (B, 2, output_channels, T, F)
      """
      out = x
      conv_out = []
      for idx, layer in enumerate(self.conv_enc):
          out = layer(out)
          conv_out.append(out)
  
      num_out = len(conv_out)
      out = self.glstm(conv_out[-1])
      res = self.skip_pathway[0](conv_out[-1])
      out = torch.cat((out, res), dim=1)
  
      for idx in range(len(self.deconv_dec) - 1):
          deconv_out = self.deconv_dec[idx](out)
          res = self.skip_pathway[idx + 1](conv_out[num_out - idx - 2])
          out = torch.cat((deconv_out, res), dim=1)
      out = self.deconv_dec[-1](out)
  
      dout_real, dout_imag = torch.chunk(out, 2, dim=1)
  
      out_real = self.fc_real(dout_real)
      out_imag = self.fc_imag(dout_imag)
      out = torch.stack([out_real, out_imag], dim=1)
  
      return out
  
imports: from typing import List
  import torch
  import torch.nn
  from espnet2.enh.layers.conv_utils import conv2d_output_shape, convtransp2d_output_shape
label_desc: Use image node_id 2 for calling the DC_CRN obj's underlying member method code with example usage: obj.forward(x) and returns: out