class_docstr: Apply transform-attend-concatenate across channels.
  The output is a concatenation of transformed channel and MHA
  over channels.
  
  Args:
      in_features: Number of input features
      out_features: Number of output features
      n_head: Number of heads for the MHA module
      dropout_rate: Dropout rate for the MHA module
  
  References:
      - Jukić et al, Flexible multichannel speech enhancement for noise-robust frontend, 2023
docstr: Args:
      input: shape (B, M, in_features, T)
  
  Returns:
      Output tensor with shape shape (B, M, out_features, T)
docstr_tok: ["Args",":","input",":","shape","(","B",",","M",",","in_features",",","T",")","Returns",":","Output","tensor","with","shape","shape","(","B",",","M",",","out_features",",","T",")"]
code: def forward(self, input: torch.Tensor) -> torch.Tensor:
      """
      Args:
          input: shape (B, M, in_features, T)
  
      Returns:
          Output tensor with shape shape (B, M, out_features, T)
      """
      B, M, F, T = input.shape
  
      # (B, M, F, T) -> (B, T, M, F)
      input = input.permute(0, 3, 1, 2)
      input = input.reshape(B * T, M, F)
  
      # transform each channel
      transform = self.transform_channel(input)
  
      # attend
      attend = self.transform_attend(input)
      # attention across channels
      attend = self.attention(
          query=attend, key=attend, value=attend, mask=None
      )
  
      # concatenate along feature dimension
      output = torch.cat([transform, attend], dim=-1)
  
      # return to the original layout
      output = output.view(B, T, M, -1)
  
      # (B, T, M, num_features) -> (B, M, num_features, T)
      output = output.permute(0, 2, 3, 1)
  
      return output
  
imports: import random
  from typing import Callable, Optional
  import torch
  from nemo.collections.asr.parts.submodules.multi_head_attention import MultiHeadAttention
  from nemo.core.classes import NeuralModule, typecheck
  from nemo.core.neural_types import AudioSignal, FloatType, NeuralType, SpectrogramType
  from nemo.utils import logging
label_desc: Use image node_id 4 for calling the TransformAttendConcatenate obj's underlying member method code with example usage: obj.forward(input) and returns: output