Exemplo n.º 1
0
  def test_create_keras_inputs_sparse_features(self):
    context_feature_columns = {
        'query':
            tf.feature_column.categorical_column_with_vocabulary_list(
                'query',
                vocabulary_list=[
                    'ranking', 'regression', 'classification', 'ordinal'
                ])
    }
    example_feature_columns = {
        'title':
            tf.feature_column.categorical_column_with_vocabulary_list(
                'title',
                vocabulary_list=[
                    'ranking', 'regression', 'classification', 'ordinal'
                ])
    }
    keras_inputs = feature.create_keras_inputs(
        context_feature_columns=context_feature_columns,
        example_feature_columns=example_feature_columns,
        size_feature_name='example_list_size')

    self.assertCountEqual(
        keras_inputs.keys(),
        list(context_feature_columns.keys()) +
        list(example_feature_columns.keys()) + ['example_list_size'])
Exemplo n.º 2
0
  def test_create_keras_inputs(self):
    keras_inputs = feature.create_keras_inputs(
        context_feature_columns=self._context_feature_columns,
        example_feature_columns=self._example_feature_columns,
        size_feature_name='example_list_size')

    self.assertCountEqual(
        keras_inputs.keys(),
        list(self._context_feature_columns.keys()) +
        list(self._example_feature_columns.keys()) + ['example_list_size'])
Exemplo n.º 3
0
  def test_keras_inputs_dynamic_list_shape(self):
    keras_inputs = feature.create_keras_inputs(
        context_feature_columns=self._context_feature_columns,
        example_feature_columns=self._example_feature_columns,
        size_feature_name=None)

    self.assertEqual(keras_inputs['query_length'].shape.as_list(), [None, 1])
    self.assertEqual(keras_inputs['query_length'].dtype, tf.int64)

    self.assertEqual(keras_inputs['utility'].shape.as_list(), [None, None, 1])
    self.assertEqual(keras_inputs['utility'].dtype, tf.float32)

    self.assertEqual(keras_inputs['unigrams'].dtype, tf.string)
Exemplo n.º 4
0
def create_keras_model(network,
                       loss,
                       metrics,
                       optimizer,
                       size_feature_name,
                       list_size=None):
  """Creates a Functional Keras ranking model.

  A mask is inferred from size_feature_name and passed to the network, along
  with feature dictionary as inputs.

  Args:
    network: (`tfr.keras.network.RankingNetwork`) A ranking network which
      generates a list of scores.
    loss: (`tfr.keras.losses._RankingLoss`) A ranking loss.
    metrics: (list) List of ranking metrics, `tfr.keras.metrics._RankingMetric`
      instances.
    optimizer: (`tf.keras.optimizer.Optimizer`) Optimizer to minimize ranking
      loss.
    size_feature_name: (str) Name of feature for example list sizes. If not
      None, this feature name corresponds to a `tf.int32` Tensor of size
      [batch_size] corresponding to sizes of example lists. If `None`, all
      examples are treated as valid.
    list_size: (int) The list size for example features. If None, use dynamic
      list size. A fixed list size is required for TPU training.

  Returns:
    A compiled ranking Keras model, a `tf.keras.Model` instance.
  """
  # TODO: Support compatibility with TPUs.
  keras_inputs = feature.create_keras_inputs(
      context_feature_columns=network.context_feature_columns,
      example_feature_columns=network.example_feature_columns,
      size_feature_name=size_feature_name,
      list_size=list_size)

  # Create mask from sizes and list_size.
  mask = None
  if size_feature_name is not None:
    mask = feature.GenerateMask(network.example_feature_columns,
                                size_feature_name)(
                                    keras_inputs)
  logits = network(inputs=keras_inputs, mask=mask)

  ranker = tf.keras.Model(inputs=keras_inputs, outputs=logits)
  ranker.compile(optimizer=optimizer, loss=loss, metrics=metrics)

  return ranker