class_docstr: Task class for NLU joint learning.
class_docstr_tok: ["Task","class","for","NLU","joint","learning","."]
docstr: Get shapes for feature.
docstr_tok: ["Get","shapes","for","feature","."]
code: def feature_spec(self):
      """Get shapes for feature."""
      feature_shapes = [
          (tf.TensorShape([self.max_seq_len]), tf.TensorShape([]))
      ]
      if not self.infer_without_label:
          feature_shapes.append(
              tf.TensorShape([self.intent_num_classes])
          )
          feature_shapes.append(tf.TensorShape([self.max_seq_len]))
      if len(feature_shapes) == 1:
          return feature_shapes[0]
      return tuple(feature_shapes)
  
file_path: delta/delta/data/task/text_nlu_joint_task.py
imports: import collections
  import delta.compat
  from absl import logging
  from delta.data.task.base_text_task import TextTask
  from delta.data.preprocess.text_ops import process_one_label_dataset
  from delta.data.preprocess.text_ops import process_multi_label_dataset
  from delta.data.utils.common_utils import get_file_len
  from delta.data.preprocess.text_ops import load_textline_dataset
  from delta.data.preprocess.utils import get_vocab_size
  from delta.utils.register import registers
  from delta.layers.utils import compute_sen_lens
  from delta import utils
label_desc: Use image node_id 4 for calling the TextNLUJointTask obj's underlying member method code with example usage: obj.feature_spec() and returns: tuple, feature_shapes