class_docstr: Convolutional Spatial Gating Unit (CSGU).
docstr: Forward method
  
  Args:
      x (torch.Tensor): (N, T, D)
      gate_add (torch.Tensor): (N, T, D/2)
  
  Returns:
      out (torch.Tensor): (N, T, D/2)
code: def forward(self, x, gate_add=None):
      """Forward method
  
      Args:
          x (torch.Tensor): (N, T, D)
          gate_add (torch.Tensor): (N, T, D/2)
  
      Returns:
          out (torch.Tensor): (N, T, D/2)
      """
  
      x_r, x_g = x.chunk(2, dim=-1)
  
      x_g = self.norm(x_g)  # (N, T, D/2)
      x_g = self.conv(x_g.transpose(1, 2)).transpose(
          1, 2
      )  # (N, T, D/2)
      if self.linear is not None:
          x_g = self.linear(x_g)
  
      if gate_add is not None:
          x_g = x_g + gate_add
  
      x_g = self.act(x_g)
      out = x_r * x_g  # (N, T, D/2)
      out = self.dropout(out)
      return out
  
file_path: espnet/espnet2/asr/layers/cgmlp.py
imports: import torch
  from espnet.nets.pytorch_backend.nets_utils import get_activation
  from espnet.nets.pytorch_backend.transformer.layer_norm import LayerNorm
label_desc: Use image node_id 3 for calling the ConvolutionalSpatialGatingUnit obj's underlying member method code with example usage: obj.forward(x, gate_add) and returns: out