class_docstr: Aggregates frame-level features to single utterance-level feature.
  Proposed in B.Desplanques et al., "ECAPA-TDNN: Emphasized Channel
  Attention, Propagation and Aggregation in TDNN Based Speaker Verification"
  
  args:
      input_size: dimensionality of the input frame-level embeddings.
          Determined by encoder hyperparameter.
          For this pooling layer, the output dimensionality will be double of
          the input_size
code: def forward(self, x, task_tokens: torch.Tensor = None):
      if task_tokens is not None:
          raise ValueError(
              "ChannelAttentiveStatisticsPooling is not adequate for task_tokens"
          )
      t = x.size()[-1]
      global_x = torch.cat(
          (
              x,
              torch.mean(x, dim=2, keepdim=True).repeat(1, 1, t),
              torch.sqrt(
                  torch.var(x, dim=2, keepdim=True).clamp(
                      min=1e-4, max=1e4
                  )
              ).repeat(1, 1, t),
          ),
          dim=1,
      )
  
      w = self.attention(global_x)
  
      mu = torch.sum(x * w, dim=2)
      sg = torch.sqrt(
          (torch.sum((x**2) * w, dim=2) - mu**2).clamp(
              min=1e-4, max=1e4
          )
      )
  
      x = torch.cat((mu, sg), dim=1)
  
      return x
  
imports: import torch
  import torch.nn
  from espnet2.spk.pooling.abs_pooling import AbsPooling
label_desc: Use image node_id 3 for calling the ChnAttnStatPooling obj's underlying member method code with example usage: obj.forward(x, task_tokens) and returns: x