code: def full_self_attention(
      x,
      self_attention_bias,
      hparams,
      q_padding="LEFT",
      kv_padding="LEFT",
  ):
      """Full self-attention layer."""
      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
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import numpy
  from six.moves import range
  from tensor2tensor.layers import common_attention
  from tensor2tensor.layers import common_layers
  from tensor2tensor.utils import expert_utils
  import tensorflow.compat.v1
  from tensorflow.compat.v1 import estimator
label_desc: Use image node_id 8 for calling a global function with example usage: full_self_attention(x, _attention_bias, hparams, q_padding, kv_padding) and returns: y