code: def call(self, x, hidden, enc_output):
      # enc_output shape == (batch_size, max_length, hidden_size)
      context_vector, attention_weights = self.attention(
          hidden, enc_output
      )
  
      if self.embedding.segment:
          x = x, tf.zeros(x.shape)
  
      # x shape after passing through embedding == (batch_size, 1, embedding_dim)
      x = self.embedding.embed_model(x)
  
      # x shape after concatenation == (batch_size, 1, embedding_dim + hidden_size)
      x = tf.concat([tf.expand_dims(context_vector, 1), x], axis=-1)
  
      # passing the concatenated vector to the GRU
      output, state = self.gru(x)
  
      # output shape == (batch_size * 1, hidden_size)
      output = tf.reshape(output, (-1, output.shape[2]))
  
      # output shape == (batch_size, vocab)
      x = self.fc(output)
  
      return x, state, attention_weights
  
file_path: Kashgari/kashgari/tasks/seq2seq/decoder/att_gru_decoder.py
imports: import tensorflow
  from kashgari.embeddings.abc_embedding import ABCEmbedding
  from kashgari.layers import L
label_desc: Use image node_id 2 for calling the AttGRUDecoder obj's underlying member method code with example usage: obj.call(x, hidden, enc_output) and returns: x,  state,  attention_weights