code: def get_vis_data_from_string(self, sess, input_string):
      
      encoded_inputs = self.encode(input_string)
  
      # Run inference graph to get the translation.
      out = sess.run(self.samples, {
          self.inputs: encoded_inputs,
      })
  
      # Run the decoded translation through the training graph to get the
      # attention tensors.
      att_mats = sess.run(self.att_mats, {
          self.inputs: encoded_inputs,
          self.targets: np.reshape(out, [1, -1, 1, 1]),
      })
  
      output_string = self.decode(out)
      input_list = self.decode_list(encoded_inputs)
      output_list = self.decode_list(out)
  
      return output_string, input_list, output_list, att_mats
docs: Constructs the data needed for visualizing attentions.
  
      Args:
        sess: A tf.Session object.
        input_string: The input sentence to be translated and visualized.
  
      Returns:
        Tuple of (
            output_string: The translated sentence.
            input_list: Tokenized input sentence.
            output_list: Tokenized translation.
            att_mats: Tuple of attention matrices; (
                enc_atts: Encoder self attention weights.
                  A list of `num_layers` numpy arrays of size
                  (batch_size, num_heads, inp_len, inp_len)
                dec_atts: Decoder self attention weights.
                  A list of `num_layers` numpy arrays of size
                  (batch_size, num_heads, out_len, out_len)
                encdec_atts: Encoder-Decoder attention weights.
                  A list of `num_layers` numpy arrays of size
                  (batch_size, num_heads, out_len, inp_len)
            )