class_docstr: Transformer decoder that applies multi-head self-attention for
  sequence decoding.
  
  It is a stack of :class:`~texar.tf.modules.encoders.MultiheadAttentionEncoder`,
  :class:`~texar.tf.modules.FeedForwardNetwork` and residual connections.
  
  Args:
      vocab_size (int, optional): Vocabulary size. Required if
          :attr:`output_layer` is `None`.
      output_layer (optional): An output layer that transforms cell output
          to logits. This can be:
  
          - A callable layer, e.g., an instance             of :tf_main:`tf.layers.Layer <layers/Layer>`.
          - A tensor. A dense layer will be created using the tensor             as the kernel weights. The bias of the dense layer is determined by            `hparams.output_layer_bias`. This can be used to tie the output             layer with the input embedding matrix, as proposed in             https://arxiv.org/pdf/1608.05859.pdf
          - `None`. A dense layer will be created based on attr:`vocab_size`            and `hparams.output_layer_bias`.
          - If no output layer in the end is needed, set             `(vocab_size=None, output_layer=tf.identity)`.
  
  .. document private functions
  .. automethod:: _build
class_docstr_tok: ["Transformer","decoder","that","applies","multi-head","self-attention","for","sequence","decoding",".","It","is","a","stack","of",":","class",":","`","~texar.tf.modules.encoders.MultiheadAttentionEncoder","`",",",":","class",":","`","~texar.tf.modules.FeedForwardNetwork","`","and","residual","connections",".","Args",":","vocab_size","(","int",",","optional",")",":","Vocabulary","size",".","Required","if",":","attr",":","`","output_layer","`","is","`","None","`",".","output_layer","(","optional",")",":","An","output","layer","that","transforms","cell","output","to","logits",".","This","can","be",":","-","A","callable","layer",",","e.g.",",","an","instance","of",":","tf_main",":","`","tf.layers.Layer","<","layers\/Layer",">","`",".","-","A","tensor",".","A","dense","layer","will","be","created","using","the","tensor","as","the","kernel","weights",".","The","bias","of","the","dense","layer","is","determined","by","`","hparams.output_layer_bias","`",".","This","can","be","used","to","tie","the","output","layer","with","the","input","embedding","matrix",",","as","proposed","in","https",":","\/\/arxiv.org\/pdf\/1608.05859.pdf","-","`","None","`",".","A","dense","layer","will","be","created","based","on","attr",":","`","vocab_size","`","and","`","hparams.output_layer_bias","`",".","-","If","no","output","layer","in","the","end","is","needed",",","set","`","(","vocab_size=None",",","output_layer=tf.identity",")","`",".","..","document","private","functions","..","automethod",":",":","_build"]
code: def __init__(self, vocab_size=None, output_layer=None, hparams=None):
      ModuleBase.__init__(self, hparams)
  
      with tf.variable_scope(self.variable_scope):
          if self._hparams.initializer:
              tf.get_variable_scope().set_initializer(
                  layers.get_initializer(self._hparams.initializer)
              )
  
          # Make the output layer
          self._output_layer, self._vocab_size = _make_output_layer(
              output_layer,
              vocab_size,
              self._hparams.output_layer_bias,
              self.variable_scope,
          )
  
          # Make attention and poswise networks
          self.multihead_attentions = {"self_att": [], "encdec_att": []}
          self.poswise_networks = []
          for i in range(self._hparams.num_blocks):
              layer_name = "layer_{}".format(i)
              with tf.variable_scope(layer_name):
                  with tf.variable_scope("self_attention"):
                      multihead_attention = MultiheadAttentionEncoder(
                          self._hparams.multihead_attention
                      )
                      self.multihead_attentions["self_att"].append(
                          multihead_attention
                      )
  
                  if (
                      self._hparams.dim
                      != multihead_attention.hparams.output_dim
                  ):
                      raise ValueError(
                          "The output dimenstion of "
                          "MultiheadEncoder should be equal "
                          "to the dim of TransformerDecoder"
                      )
  
                  with tf.variable_scope("encdec_attention"):
                      multihead_attention = MultiheadAttentionEncoder(
                          self._hparams.multihead_attention
                      )
                      self.multihead_attentions["encdec_att"].append(
                          multihead_attention
                      )
  
                  if (
                      self._hparams.dim
                      != multihead_attention.hparams.output_dim
                  ):
                      raise ValueError(
                          "The output dimenstion of "
                          "MultiheadEncoder should be equal "
                          "to the dim of TransformerDecoder"
                      )
  
                  pw_net = FeedForwardNetwork(
                      hparams=self._hparams["poswise_feedforward"]
                  )
                  final_dim = pw_net.hparams.layers[-1]["kwargs"][
                      "units"
                  ]
                  if self._hparams.dim != final_dim:
                      raise ValueError(
                          "The output dimenstion of "
                          '"poswise_feedforward" should be equal '
                          'to the "dim" of TransformerDecoder.'
                      )
                  self.poswise_networks.append(pw_net)
  
          # Built in _build()
          self.context = None
          self.context_sequence_length = None
          self.embedding = None
          self._helper = None
          self._cache = None
          self.max_decoding_length = None
  
imports: import collections
  import tensorflow
  from tensorflow.contrib.seq2seq import Decoder
  from texar.tf.core import layers
  from texar.tf.module_base import ModuleBase
  from texar.tf.modules.networks.networks import FeedForwardNetwork
  from texar.tf.modules.encoders.transformer_encoders import default_transformer_poswise_net_hparams
  from texar.tf.modules.encoders.multihead_attention import MultiheadAttentionEncoder
  from texar.tf.modules.decoders.rnn_decoder_base import _make_output_layer
  from texar.tf.modules.decoders import tf_helpers
  from texar.tf.utils import beam_search, transformer_attentions
  from texar.tf.utils.shapes import shape_list
  from texar.tf.utils.mode import is_train_mode
  from texar.tf.modules.decoders.dynamic_decode import dynamic_decode
label_desc: Use image node_id 1 to create a new TransformerDecoder object from inherited base classes: ModuleBase, TFDecoder with example: obj = TransformerDecoder(vocab_size, output_layer, hparams)