code: def _extract_argmax_and_embed(
      embedding, output_projection=None, update_embedding=True
  ):
      """Get a loop_function that extracts the previous symbol and embeds it.
  
      Args:
          embedding: embedding tensor for symbols.
          output_projection: None or a pair (W, B). If provided, each fed previous
              output will first be multiplied by W and added B.
          update_embedding: Boolean; if False, the gradients will not propagate
              through the embeddings.
  
      Returns:
          A loop function.
      """
  
      def loop_function(prev, _):
          if output_projection is not None:
              prev = tf.compat.v1.nn.xw_plus_b(
                  prev, output_projection[0], output_projection[1]
              )
          prev_symbol = tf.argmax(prev, 1)
          # Note that gradients will not propagate through the second parameter of
          # embedding_lookup.
          emb_prev = tf.nn.embedding_lookup(embedding, prev_symbol)
          if not update_embedding:
              emb_prev = tf.stop_gradient(emb_prev)
          return emb_prev
  
      return loop_function
  
file_path: attention-ocr/aocr/model/seq2seq.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  from six.moves import xrange
  from six.moves import zip
  import tensorflow
  from tensorflow.python.ops import array_ops
  from tensorflow.python.ops import init_ops
  from tensorflow.python.ops import math_ops
  from tensorflow.python.ops import nn_ops
  from tensorflow.python.ops import variable_scope
  from tensorflow.python.util import nest
label_desc: Use image node_id 2 for calling a global function with example usage: _extract_argmax_and_embed(embedding, output_projection, update_embedding) and returns: loop_function, emb_prev