code: def attend(x, source, hparams, name):
    
    with tf.variable_scope(name):
      x = tf.squeeze(x, axis=2)
      if len(source.get_shape()) > 3:
        source = tf.squeeze(source, axis=2)
      source = common_attention.add_timing_signal_1d(source)
      y = common_attention.multihead_attention(
          common_layers.layer_preprocess(x, hparams), source, None,
          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)
      res = common_layers.layer_postprocess(x, y, hparams)
      return tf.expand_dims(res, axis=2)
docs: Self-attention layer with source as memory antecedent.