code: def full_self_attention(x,
                          self_attention_bias,
                          hparams,
                          q_padding="LEFT",
                          kv_padding="LEFT"):
    
    x, x_shape, is_4d = maybe_reshape_4d_to_3d(x)
    if self_attention_bias is not None:
      self_attention_bias = get_self_attention_bias(x)
    with tf.variable_scope("self_att"):
      y = common_attention.multihead_attention(
          x,
          None,
          self_attention_bias,
          hparams.attention_key_channels or hparams.hidden_size,
          hparams.attention_value_channels or hparams.hidden_size,
          hparams.hidden_size,
          hparams.num_heads,
          hparams.attention_dropout,
          q_filter_width=hparams.q_filter_width,
          kv_filter_width=hparams.kv_filter_width,
          q_padding=q_padding,
          kv_padding=kv_padding,
          name="self_att")
      if is_4d:
        y = tf.reshape(y, [x_shape[0], x_shape[1], x_shape[2], x_shape[3]])
        y.set_shape([None, None, None, hparams.hidden_size])
      return y
docs: Full self-attention layer.