class_docstr: Use attention pooling to aggregate information across channels.
  First apply MHA across channels and then apply averaging.
  
  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:
      - Wang et al, Neural speech separation using sparially distributed microphones, 2020
      - Jukić et al, Flexible multichannel speech enhancement for noise-robust frontend, 2023
code: def __init__(
      self, in_features: int, n_head: int = 1, dropout_rate: float = 0
  ):
      super().__init__()
      self.in_features = in_features
      self.attention = MultiHeadAttention(
          n_head=n_head, n_feat=in_features, dropout_rate=dropout_rate
      )
  
      logging.debug("Initialized %s with", self.__class__.__name__)
      logging.debug("\tin_features:  %d", in_features)
      logging.debug("\tnum_heads:    %d", n_head)
      logging.debug("\tdropout_rate: %d", dropout_rate)
  
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 1 to create a new ChannelAttentionPool object from inherited base classes: NeuralModule with example: obj = ChannelAttentionPool(in_features, n_head, dropout_rate)