Ejemplo n.º 1
0
  def create_estimator_spec(
      self, features, mode, logits, labels=None, train_op_fn=None):
    """See `Head`."""
    with ops.name_scope('head'):
      logits = head_lib._check_logits(logits, self.logits_dimension)  # pylint:disable=protected-access

      # Predict.
      pred_keys = prediction_keys.PredictionKeys
      with ops.name_scope(None, 'predictions', (logits,)):
        probabilities = math_ops.sigmoid(logits, name=pred_keys.PROBABILITIES)
        predictions = {
            pred_keys.LOGITS: logits,
            pred_keys.PROBABILITIES: probabilities,
        }
      if mode == model_fn.ModeKeys.PREDICT:
        return model_fn.EstimatorSpec(
            mode=model_fn.ModeKeys.PREDICT,
            predictions=predictions,
            export_outputs={
                '': export_output.ClassificationOutput(scores=probabilities)
            })

      # Eval.
      unweighted_loss, processed_labels = self.create_loss(
          features=features, mode=mode, logits=logits, labels=labels)
      # Averages loss over classes.
      per_example_loss = math_ops.reduce_mean(
          unweighted_loss, axis=-1, keep_dims=True)
      weights = head_lib._weights(features, self._weight_column)  # pylint:disable=protected-access
      training_loss = losses.compute_weighted_loss(
          per_example_loss, weights=weights, reduction=losses.Reduction.SUM)
      if mode == model_fn.ModeKeys.EVAL:
        return model_fn.EstimatorSpec(
            mode=model_fn.ModeKeys.EVAL,
            predictions=predictions,
            loss=training_loss,
            eval_metric_ops=self._eval_metric_ops(
                labels=processed_labels,
                probabilities=probabilities,
                weights=weights,
                per_example_loss=per_example_loss))

      # Train.
      if train_op_fn is None:
        raise ValueError('train_op_fn can not be None.')
    with ops.name_scope(''):
      summary.scalar(
          head_lib._summary_key(self._name, metric_keys.MetricKeys.LOSS),  # pylint:disable=protected-access
          training_loss)
      summary.scalar(
          head_lib._summary_key(  # pylint:disable=protected-access
              self._name, metric_keys.MetricKeys.LOSS_MEAN),
          losses.compute_weighted_loss(
              unweighted_loss, weights=weights,
              reduction=losses.Reduction.MEAN))
    return model_fn.EstimatorSpec(
        mode=model_fn.ModeKeys.TRAIN,
        predictions=predictions,
        loss=training_loss,
        train_op=train_op_fn(training_loss))
Ejemplo n.º 2
0
 def create_estimator_spec(self):
     # Predict.
     with ops.name_scope('head'):
         with ops.name_scope(None, 'predictions', (self.logits_combine,)):
             logits = head_lib._check_logits(self.logits_combine, self.logits_dimension)
             logistic = math_ops.sigmoid(logits, name='logistic')
             two_class_logits = array_ops.concat(
                     (array_ops.zeros_like(logits), logits), 1,
                     name='two_class_logits')
             scores = nn.softmax(two_class_logits, name='probabilities')
             class_ids = array_ops.reshape(
                     math_ops.argmax(two_class_logits, axis=1),
                     (-1, 1),
                     name='classes')
             classes = string_ops.as_string(class_ids, name='str_classes')
             predictions = {
                 'logits': logits,
                 'logistic': logistic,
                 'probabilities': scores,
                 'class_ids': class_ids,
                 'classes': classes,
             }
         
         if self.mode == model_fn.ModeKeys.PREDICT:
             #batch_size = array_ops.shape(logistic)[0]
             #export_class_list = string_ops.as_string([0, 1])
             #export_output_classes = array_ops.tile(
             #        input=array_ops.expand_dims(input=export_class_list, axis=0),
             #        multiples=[batch_size, 1])
             classifier_output = RankClassifierExportOutput(prob=scores)
             return model_fn.EstimatorSpec(
                     mode=model_fn.ModeKeys.PREDICT,
                     predictions=predictions,
                     export_outputs={
                         'serving_default': classifier_output,
                         'classification': classifier_output,
                         'regression': export_output.RegressionOutput(logistic),
                         'predict': export_output.PredictOutput(predictions)
                     })
         
         # calculate loss
         unweighted_loss, processed_labels, training_loss, weights = self.calc_loss(logits)
         
         # Eval.
         if self.mode == model_fn.ModeKeys.EVAL:
             eval_metric_ops = self.eval_metric_ops(
                     labels=processed_labels,
                     logits=logits,
                     logistic=logistic,
                     scores=scores,
                     class_ids=class_ids,
                     unweighted_loss=unweighted_loss,
                     weights=weights)
             return model_fn.EstimatorSpec(
                     mode=model_fn.ModeKeys.EVAL,
                     predictions=predictions,
                     loss=training_loss,
                     eval_metric_ops=eval_metric_ops)
         # Train
         return self.train_fn(training_loss, unweighted_loss, weights, predictions)
Ejemplo n.º 3
0
    def create_estimator_spec(self):
        # Predict.
        with ops.name_scope('head'):
            with ops.name_scope(None, 'predictions', (self.logits_combine, )):
                dnn_logits = head_lib._check_logits(self.logits_combine,
                                                    self.logits_dimension)
                item_id_net = self.item_id_net
                if (self.mode == model_fn.ModeKeys.EVAL):
                    logits = tf.reduce_sum(tf.multiply(dnn_logits,
                                                       item_id_net),
                                           reduction_indices=1,
                                           keep_dims=True)
                    #logits = tf.reduce_sum(tf.multiply(dnn_logits, item_id_net), reduction_indices=1, keep_dims = True) + tf.reduce_sum(self.bias_net, axis = 1, keep_dims = True)
                else:
                    logits = tf.reduce_sum(
                        tf.multiply(dnn_logits, item_id_net),
                        reduction_indices=1,
                        keep_dims=True) + tf.reduce_sum(
                            self.bias_net, axis=1, keep_dims=True)
                logistic = math_ops.sigmoid(logits, name='logistic')
                two_class_logits = array_ops.concat(
                    (array_ops.zeros_like(logits), logits),
                    1,
                    name='two_class_logits')
                scores = nn.softmax(two_class_logits, name='probabilities')
                class_ids = array_ops.reshape(math_ops.argmax(two_class_logits,
                                                              axis=1), (-1, 1),
                                              name='classes')
                classes = string_ops.as_string(class_ids, name='str_classes')
                predictions = {
                    'logits': logits,
                    'logistic': logistic,
                    'probabilities': scores,
                    'class_ids': class_ids,
                    'classes': classes,
                }

            # calculate loss
            unweighted_loss, processed_labels, training_loss, weights = self.calc_loss(
                logits)

            # Eval.
            if self.mode == model_fn.ModeKeys.EVAL:
                return model_fn.EstimatorSpec(mode=model_fn.ModeKeys.EVAL,
                                              predictions=predictions,
                                              loss=training_loss)
            # Train
            return self.train_fn(training_loss, unweighted_loss, weights,
                                 predictions)
Ejemplo n.º 4
0
    def create_estimator_spec(self,
                              features,
                              mode,
                              logits,
                              labels=None,
                              train_op_fn=None):
        """See `Head`."""
        with ops.name_scope(self._name, 'head'):
            logits = head_lib._check_logits(logits, self.logits_dimension)  # pylint:disable=protected-access

            # Predict.
            pred_keys = prediction_keys.PredictionKeys
            with ops.name_scope(None, 'predictions', (logits, )):
                probabilities = math_ops.sigmoid(logits,
                                                 name=pred_keys.PROBABILITIES)
                predictions = {
                    pred_keys.LOGITS: logits,
                    pred_keys.PROBABILITIES: probabilities,
                }
            if mode == model_fn.ModeKeys.PREDICT:
                classifier_output = head_lib._classification_output(  # pylint:disable=protected-access
                    scores=probabilities,
                    n_classes=self._n_classes,
                    label_vocabulary=self._label_vocabulary)
                return model_fn.EstimatorSpec(
                    mode=model_fn.ModeKeys.PREDICT,
                    predictions=predictions,
                    export_outputs={
                        _DEFAULT_SERVING_KEY:
                        classifier_output,
                        head_lib._CLASSIFY_SERVING_KEY:
                        classifier_output,  # pylint:disable=protected-access
                        head_lib._PREDICT_SERVING_KEY: (  # pylint:disable=protected-access
                            export_output.PredictOutput(predictions))
                    })

            (weighted_sum_loss, example_weight_sum,
             processed_labels) = self.create_loss(features=features,
                                                  mode=mode,
                                                  logits=logits,
                                                  labels=labels)

            # Eval.
            if mode == model_fn.ModeKeys.EVAL:
                return model_fn.EstimatorSpec(
                    mode=model_fn.ModeKeys.EVAL,
                    predictions=predictions,
                    loss=weighted_sum_loss,
                    eval_metric_ops=self._eval_metric_ops(
                        labels=processed_labels,
                        probabilities=probabilities,
                        weights=head_lib._weights(features,
                                                  self._weight_column),  # pylint:disable=protected-access,
                        weighted_sum_loss=weighted_sum_loss,
                        example_weight_sum=example_weight_sum))

            # Train.
            if train_op_fn is None:
                raise ValueError('train_op_fn can not be None.')
        with ops.name_scope(''):
            summary.scalar(
                head_lib._summary_key(self._name, metric_keys.MetricKeys.LOSS),  # pylint:disable=protected-access
                weighted_sum_loss)
            summary.scalar(
                head_lib._summary_key(  # pylint:disable=protected-access
                    self._name, metric_keys.MetricKeys.LOSS_MEAN),
                weighted_sum_loss / example_weight_sum)
        return model_fn.EstimatorSpec(mode=model_fn.ModeKeys.TRAIN,
                                      predictions=predictions,
                                      loss=weighted_sum_loss,
                                      train_op=train_op_fn(weighted_sum_loss))
Ejemplo n.º 5
0
  def create_estimator_spec(
      self, features, mode, logits, labels=None, train_op_fn=None):
    """See `Head`."""
    with ops.name_scope(self._name, 'head'):
      logits = head_lib._check_logits(logits, self.logits_dimension)  # pylint:disable=protected-access

      # Predict.
      pred_keys = prediction_keys.PredictionKeys
      with ops.name_scope(None, 'predictions', (logits,)):
        probabilities = math_ops.sigmoid(logits, name=pred_keys.PROBABILITIES)
        predictions = {
            pred_keys.LOGITS: logits,
            pred_keys.PROBABILITIES: probabilities,
        }
      if mode == model_fn.ModeKeys.PREDICT:
        classifier_output = head_lib._classification_output(  # pylint:disable=protected-access
            scores=probabilities, n_classes=self._n_classes,
            label_vocabulary=self._label_vocabulary)
        return model_fn.EstimatorSpec(
            mode=model_fn.ModeKeys.PREDICT,
            predictions=predictions,
            export_outputs={
                _DEFAULT_SERVING_KEY: classifier_output,
                head_lib._CLASSIFY_SERVING_KEY: classifier_output,  # pylint:disable=protected-access
                head_lib._PREDICT_SERVING_KEY: (  # pylint:disable=protected-access
                    export_output.PredictOutput(predictions))
            })

      (weighted_sum_loss, example_weight_sum,
       processed_labels) = self.create_loss(
           features=features, mode=mode, logits=logits, labels=labels)

      # Eval.
      if mode == model_fn.ModeKeys.EVAL:
        return model_fn.EstimatorSpec(
            mode=model_fn.ModeKeys.EVAL,
            predictions=predictions,
            loss=weighted_sum_loss,
            eval_metric_ops=self._eval_metric_ops(
                labels=processed_labels,
                probabilities=probabilities,
                weights=head_lib._weights(features, self._weight_column),  # pylint:disable=protected-access,
                weighted_sum_loss=weighted_sum_loss,
                example_weight_sum=example_weight_sum))

      # Train.
      if train_op_fn is None:
        raise ValueError('train_op_fn can not be None.')
    with ops.name_scope(''):
      summary.scalar(
          head_lib._summary_key(self._name, metric_keys.MetricKeys.LOSS),  # pylint:disable=protected-access
          weighted_sum_loss)
      summary.scalar(
          head_lib._summary_key(  # pylint:disable=protected-access
              self._name, metric_keys.MetricKeys.LOSS_MEAN),
          weighted_sum_loss / example_weight_sum)
    return model_fn.EstimatorSpec(
        mode=model_fn.ModeKeys.TRAIN,
        predictions=predictions,
        loss=weighted_sum_loss,
        train_op=train_op_fn(weighted_sum_loss))