class_docstr: Arguments
  ---------
  N : int
      Number of filters in autoencoder.
  B : int
      Number of channels in bottleneck 1 × 1-conv block.
  H : int
      Number of channels in convolutional blocks.
  P : int
      Kernel size in convolutional blocks.
  X : int
      Number of convolutional blocks in each repeat.
  R : int
      Number of repeats.
  C : int
      Number of speakers.
  norm_type : str
      One of BN, gLN, cLN.
  causal : bool
      Causal or non-causal.
  mask_nonlinear : str
      Use which non-linear function to generate mask, in ['softmax', 'relu'].
  
  Example:
  ---------
  >>> N, B, H, P, X, R, C = 11, 12, 2, 5, 3, 1, 2
  >>> MaskNet = MaskNet(N, B, H, P, X, R, C)
  >>> mixture_w = torch.randn(10, 11, 100)
  >>> est_mask = MaskNet(mixture_w)
  >>> est_mask.shape
  torch.Size([2, 10, 11, 100])
docstr: Keep this API same with TasNet.
  
  Arguments
  ---------
  mixture_w : Tensor
      Tensor shape is [M, K, N], M is batch size.
  
  Returns
  -------
  est_mask : Tensor
      Tensor shape is [M, K, C, N].
docstr_tok: ["Keep","this","API","same","with","TasNet",".","Arguments","--","--","--","--","-","mixture_w",":","Tensor","Tensor","shape","is","[","M",",","K",",","N","]",",","M","is","batch","size",".","Returns","--","--","--","-","est_mask",":","Tensor","Tensor","shape","is","[","M",",","K",",","C",",","N","]","."]
code: def forward(self, mixture_w):
      """Keep this API same with TasNet.
  
      Arguments
      ---------
      mixture_w : Tensor
          Tensor shape is [M, K, N], M is batch size.
  
      Returns
      -------
      est_mask : Tensor
          Tensor shape is [M, K, C, N].
      """
      mixture_w = mixture_w.permute(0, 2, 1)
      M, K, N = mixture_w.size()
      y = self.layer_norm(mixture_w)
      y = self.bottleneck_conv1x1(y)
      y = self.temporal_conv_net(y)
      score = self.mask_conv1x1(y)
  
      # score = self.network(mixture_w)  # [M, K, N] -> [M, K, C*N]
      score = score.contiguous().reshape(
          M, K, self.C, N
      )  # [M, K, C*N] -> [M, K, C, N]
  
      # [M, K, C, N] -> [C, M, N, K]
      score = score.permute(2, 0, 3, 1)
  
      if self.mask_nonlinear == "softmax":
          est_mask = F.softmax(score, dim=2)
      elif self.mask_nonlinear == "relu":
          est_mask = F.relu(score)
      else:
          raise ValueError("Unsupported mask non-linear function")
      return est_mask
  
imports: import torch
  import torch.nn
  import speechbrain
  import torch.nn.functional
  from speechbrain.processing.signal_processing import overlap_and_add
label_desc: Use image node_id 2 for calling the MaskNet obj's underlying member method code with example usage: obj.forward(mixture_w) and returns: est_mask