class_docstr: General self-attention block/non-local block.
  
  The original article refers to refer to https://arxiv.org/abs/1706.03762.
  Args:
      key_in_channels (int): Input channels of key feature.
      query_in_channels (int): Input channels of query feature.
      channels (int): Output channels of key/query transform.
      out_channels (int): Output channels.
      share_key_query (bool): Whether share projection weight between key
          and query projection.
      query_downsample (nn.Module): Query downsample module.
      key_downsample (nn.Module): Key downsample module.
      key_query_num_convs (int): Number of convs for key/query projection.
      value_out_num_convs (int): Number of convs for value projection.
      key_query_norm (bool): Whether to use BN for key/query projection.
      value_out_norm (bool): Whether to use BN for value projection.
      matmul_norm (bool): Whether normalize attention map with sqrt of
          channels
      with_out (bool): Whether use out projection.
code: def __init__(
      self,
      key_in_channels,
      query_in_channels,
      channels,
      out_channels,
      share_key_query,
      query_downsample,
      key_downsample,
      key_query_num_convs,
      value_out_num_convs,
      key_query_norm,
      value_out_norm,
      matmul_norm,
      with_out,
  ):
      super(AttentionBlock, self).__init__()
      if share_key_query:
          assert key_in_channels == query_in_channels
      self.with_out = with_out
      self.key_in_channels = key_in_channels
      self.query_in_channels = query_in_channels
      self.out_channels = out_channels
      self.channels = channels
      self.share_key_query = share_key_query
      self.key_project = self.build_project(
          key_in_channels,
          channels,
          num_convs=key_query_num_convs,
          use_conv_module=key_query_norm,
      )
      if share_key_query:
          self.query_project = self.key_project
      else:
          self.query_project = self.build_project(
              query_in_channels,
              channels,
              num_convs=key_query_num_convs,
              use_conv_module=key_query_norm,
          )
  
      self.value_project = self.build_project(
          key_in_channels,
          channels if self.with_out else out_channels,
          num_convs=value_out_num_convs,
          use_conv_module=value_out_norm,
      )
  
      if self.with_out:
          self.out_project = self.build_project(
              channels,
              out_channels,
              num_convs=value_out_num_convs,
              use_conv_module=value_out_norm,
          )
      else:
          self.out_project = None
  
      self.query_downsample = query_downsample
      self.key_downsample = key_downsample
      self.matmul_norm = matmul_norm
  
imports: import paddle
  import paddle.nn
  import paddle.nn.functional
  from paddle.nn.layer import activation
  from paddle.nn import Conv2D, AvgPool2D
label_desc: Use image node_id 1 to create a new AttentionBlock object from inherited base classes: nn with example: obj = AttentionBlock(key_in_channels, query_in_channels, channels, out_channels, share_key_query, query_downsample, key_downsample, key_query_num_convs, value_out_num_convs, key_query_norm, value_out_norm, matmul_norm, with_out)