class_docstr: Generalized Additive Model (GAM) based univariate ranking network.
docstr: Univariate scoring of context and one example to generate a score.
  
  Args:
    context_features: (dict) context feature names to 2D tensors of shape
      [batch_size, ...].
    example_features: (dict) example feature names to 2D tensors of shape
      [batch_size, ...].
    training: (bool) whether in training or inference mode.
  
  Returns:
    (tf.Tensor) A score tensor of shape [batch_size, 1].
docstr_tok: ["Univariate","scoring","of","context","and","one","example","to","generate","a","score",".","Args",":","context_features",":","(","dict",")","context","feature","names","to","2D","tensors","of","shape","[","batch_size",",","...","]",".","example_features",":","(","dict",")","example","feature","names","to","2D","tensors","of","shape","[","batch_size",",","...","]",".","training",":","(","bool",")","whether","in","training","or","inference","mode",".","Returns",":","(","tf.Tensor",")","A","score","tensor","of","shape","[","batch_size",",","1","]","."]
code: def score(
      self, context_features=None, example_features=None, training=True
  ):
      """Univariate scoring of context and one example to generate a score.
  
      Args:
        context_features: (dict) context feature names to 2D tensors of shape
          [batch_size, ...].
        example_features: (dict) example feature names to 2D tensors of shape
          [batch_size, ...].
        training: (bool) whether in training or inference mode.
  
      Returns:
        (tf.Tensor) A score tensor of shape [batch_size, 1].
      """
      example_feature_names = sorted(
          list(self.example_feature_columns.keys())
      )
      context_feature_names = sorted(
          list(self.context_feature_columns.keys())
      )
      context_input = [
          tf.keras.layers.Flatten()(context_features[name])
          for name in context_feature_names
      ]
      example_input = [
          tf.keras.layers.Flatten()(example_features[name])
          for name in example_feature_names
      ]
  
      # Construct a tower for each example feature.
      sub_logits_list = []
      with tf.name_scope("example_feature_towers"):
          for name, input_tensor in zip(
              example_feature_names, example_input
          ):
              with tf.name_scope("{}_tower".format(name)):
                  cur = input_tensor
                  layers = self._per_example_feature_layers[name]
                  for layer in layers:
                      cur = layer(cur, training=training)
                  sub_logits = tf.identity(
                      cur, name="{}_{}".format(name, _SUBSCORE_POSTFIX)
                  )
                  sub_logits_list.append(sub_logits)
  
      sub_weights_list = []
      if context_input:
          # Construct a tower for each context feature.
          with tf.name_scope("context_feature_towers"):
              for name, input_tensor in zip(
                  context_feature_names, context_input
              ):
                  with tf.name_scope("{}_tower".format(name)):
                      cur = input_tensor
                      layers = self._per_context_feature_layers[name]
                      for layer in layers:
                          cur = layer(cur, training=training)
                      cur = tf.keras.layers.Softmax()(cur)
                      sub_weights = tf.identity(
                          cur,
                          name="{}_{}".format(name, _SUBWEIGHT_POSTFIX),
                      )
                      sub_weights_list.append(sub_weights)
  
      # Construct an additive model from the outputs of all example feature towers
      # weighted by outputs of all context feature towers.
      # Note that these layers do not have any trainable variables, hence we
      # are not defining them in init but defining them here, similar to Flatten.
      if sub_weights_list:
          sub_logits = tf.keras.layers.Concatenate(axis=-1)(
              sub_logits_list
          )
          sub_weights = (
              tf.keras.layers.Add()(sub_weights_list)
              if len(sub_weights_list) > 1
              else sub_weights_list[0]
          )
          logits = tf.keras.backend.sum(
              sub_logits * sub_weights, axis=-1
          )
      else:
          logits = (
              tf.keras.layers.Add()(sub_logits_list)
              if len(sub_logits_list) > 1
              else sub_logits_list[0]
          )
      return logits
  
file_path: ranking/tensorflow_ranking/python/keras/canned/gam.py
imports: import tensorflow.compat.v2
  from tensorflow_ranking.python.keras import network
label_desc: Use image node_id 2 for calling the GAMRankingNetwork obj's underlying member method code with example usage: obj.score(context_features, example_features, training) and returns: logits