class_docstr: Gated convolutional block as in https://arxiv.org/pdf/1612.08083.pdf
  Args:
      in_out_channels (int): number of input/output channels.
      kernel_size (int): convolution kernel size.
      dropout_p (float): dropout rate.
class_docstr_tok: ["Gated","convolutional","block","as","in","https",":","\/\/arxiv.org\/pdf\/1612.08083.pdf","Args",":","in_out_channels","(","int",")",":","number","of","input\/output","channels",".","kernel_size","(","int",")",":","convolution","kernel","size",".","dropout_p","(","float",")",":","dropout","rate","."]
code: def forward(self, x, x_mask):
      o = x
      res = x
      for idx in range(self.num_layers):
          o = nn.functional.dropout(
              o, p=self.dropout_p, training=self.training
          )
          o = self.conv_layers[idx](o * x_mask)
          o = self.norm_layers[idx](o)
          o = nn.functional.glu(o, dim=1)
          o = res + o
          res = o
      return o
  
imports: from torch import nn
  from .normalization import LayerNorm
label_desc: Use image node_id 2 for calling the GatedConvBlock obj's underlying member method code with example usage: obj.forward(x, x_mask) and returns: o