Esempio n. 1
0
    def test_make_json_formatted_for_single_chart_classification(self):
        """Test making a classification chart with a single point on it."""
        inference_result_proto = classification_pb2.ClassificationResponse()
        classification = inference_result_proto.result.classifications.add()
        inference_class = classification.classes.add()
        inference_class.label = 'class_a'
        inference_class.score = 0.7

        inference_class = classification.classes.add()
        inference_class.label = 'class_b'
        inference_class.score = 0.3

        original_feature = inference_utils.OriginalFeatureList(
            'feature_name', [2.], 'float_list')
        mutant_feature = inference_utils.MutantFeatureValue(original_feature,
                                                            index=0,
                                                            mutant_value=20)

        jsonable = inference_utils.make_json_formatted_for_single_chart(
            [mutant_feature], inference_result_proto, 0)

        self.assertEqual(['class_a', 'class_b'], sorted(jsonable.keys()))
        self.assertEqual(1, len(jsonable['class_a']))
        self.assertEqual(20, jsonable['class_a'][0]['step'])
        self.assertAlmostEqual(0.7, jsonable['class_a'][0]['scalar'])

        self.assertEqual(1, len(jsonable['class_b']))
        self.assertEqual(20, jsonable['class_b'][0]['step'])
        self.assertAlmostEqual(0.3, jsonable['class_b'][0]['scalar'])
def test_pb_request():
    request = classification_pb2.ClassificationRequest()
    request.model_spec.name = "generic_model"
    request.model_spec.signature_name = DEFAULT_SERVING_SIGNATURE_DEF_KEY
    example = request.input.example_list.examples.add()

    data = [4.9, 2.5, 4.5, 1.7]
    example.features.feature[PREDICT_INPUTS].float_list.value.extend(data)

    serialized_output = requests.post("http://localhost:8080/invocations",
                                      data=request.SerializeToString(),
                                      headers={
                                          'Content-type':
                                          'application/octet-stream',
                                          'Accept': 'application/octet-stream'
                                      }).content

    classification_response = classification_pb2.ClassificationResponse()
    classification_response.ParseFromString(serialized_output)

    classifications_classes = classification_response.result.classifications[
        0].classes
    assert len(classifications_classes) == 3
    for c in classifications_classes:
        assert c.score < 1
        assert c.score > 0
Esempio n. 3
0
def convert_prediction_values(values, serving_bundle, model_spec=None):
    """Converts tensor values into ClassificationResponse or
    RegressionResponse.

    Args:
      values: For classification, a 2D list of numbers. The first dimension is for
        each example being predicted. The second dimension are the probabilities
        for each class ID in the prediction. For regression, a 1D list of numbers,
        with a regression score for each example being predicted.
      serving_bundle: A `ServingBundle` object that contains the information about
        the serving request that the response was generated by.
      model_spec: Optional model spec to put into the response.

    Returns:
      A ClassificationResponse or RegressionResponse.
    """
    if serving_bundle.model_type == "classification":
        response = classification_pb2.ClassificationResponse()
        for example_index in range(len(values)):
            classification = response.result.classifications.add()
            for class_index in range(len(values[example_index])):
                class_score = classification.classes.add()
                class_score.score = values[example_index][class_index]
                class_score.label = str(class_index)
    else:
        response = regression_pb2.RegressionResponse()
        for example_index in range(len(values)):
            regression = response.result.regressions.add()
            regression.value = values[example_index]
    if model_spec:
        response.model_spec.CopyFrom(model_spec)
    return response
Esempio n. 4
0
def convert_predict_response(pred, serving_bundle):
    """Converts a PredictResponse to ClassificationResponse or RegressionResponse.

  Args:
    pred: PredictResponse to convert.
    serving_bundle: A `ServingBundle` object that contains the information about
      the serving request that the response was generated by.

  Returns:
    A ClassificationResponse or RegressionResponse.
  """
    output = pred.outputs[serving_bundle.predict_output_tensor]
    raw_output = output.float_val
    output_index = 0
    if serving_bundle.model_type == 'classification':
        response = classification_pb2.ClassificationResponse()
        response.model_spec.CopyFrom(pred.model_spec)
        for _ in range(output.tensor_shape.dim[0].size):
            classification = response.result.classifications.add()
            for class_index in range(output.tensor_shape.dim[1].size):
                class_score = classification.classes.add()
                class_score.score = raw_output[output_index]
                output_index += 1
                class_score.label = str(class_index)
    else:
        response = regression_pb2.RegressionResponse()
        response.model_spec.CopyFrom(pred.model_spec)
        for _ in range(output.tensor_shape.dim[0].size):
            regression = response.result.regressions.add()
            regression.value = raw_output[output_index]
            output_index += 1
    return response
  def test_wrap_inference_results_classification(self):
    """Test wrapping a classification result."""
    inference_result_proto = classification_pb2.ClassificationResponse()
    classification = inference_result_proto.result.classifications.add()
    inference_class = classification.classes.add()
    inference_class.label = 'class_b'
    inference_class.score = 0.3
    inference_class = classification.classes.add()
    inference_class.label = 'class_a'
    inference_class.score = 0.7

    wrapped = inference_utils.wrap_inference_results(inference_result_proto)
    self.assertEqual(1, len(wrapped.classification_result.classifications))
    self.assertEqual(
        2, len(wrapped.classification_result.classifications[0].classes))
Esempio n. 6
0
    def Classify(self, request, context):
        try:
            example = request.input.example_list.examples[0]

            start_time_millis = self.getCurrentTimeinMillis()
            time_1 = datetime.now()
            if self._Validations(request, context) is True:
                time_2 = datetime.now()

                example = request.input.example_list.examples[0]

                idx = 0
                final_input = []
                final_labels = []
                for k in example.features.feature.keys():
                    v = example.features.feature[k]
                    int_list_value = list(v.int64_list.value)
                    float_list_value = list(v.float_list.value)
                    byte_list_value = list(v.bytes_list.value)

                    if len(int_list_value) > 0:
                        final_input.append(int_list_value)
                        final_labels.append(k)
                    elif len(float_list_value) > 0:
                        final_input.append(float_list_value)
                        final_labels.append(k)
                    elif len(byte_list_value) > 0:
                        final_input.append(byte_list_value)
                        final_labels.append(k)
                    else:
                        LOG.info("Input param empty, ignoring it")
                    idx = idx + 1

                classification_request = pd.DataFrame.from_records(
                    list(zip(*final_input)), columns=final_labels)

                try:
                    classification_outputs = self.model.wrapper_classification_func(
                        classification_request)
                    LOG.info(
                        "the output from the model's classification function %s",
                        classification_outputs)
                    response = tensorflow__serving_dot_apis_dot_classification__pb2.ClassificationResponse(
                    )

                except grpc.RpcError as grpc_error:
                    end_time_millis = self.getCurrentTimeinMillis()
                    LOG.error("Error while doing Classification")
                    requestDurationInMillis = str(end_time_millis -
                                                  start_time_millis)
                    self.logRequests(self.model.model_name,
                                     requestDurationInMillis, str(0))
                    LOG.error("grpc error : %s", str(grpc_error))
                    s = getattr(grpc_error, 'message', str(grpc_error))
                    raise grpc.RpcError(grpc_error)
                    return None

                classifications = []
                for idx in range(0, classification_request.shape[0]):
                    classes = []
                    classification = tensorflow__serving_dot_apis_dot_classification__pb2.Classifications(
                    )
                    for k, v in classification_outputs.items():
                        class_data = tensorflow__serving_dot_apis_dot_classification__pb2.Class(
                        )
                        class_data.label = "Class-" + k
                        class_data.score = v[idx]
                        classes.append(class_data)
                    classification.classes.extend(classes)
                    classifications.append(classification)
                response.result.classifications.extend(classifications)

                return response
            else:
                return None
        except Exception as ex:
            s = getattr(ex, 'message', str(ex))
            raise Exception(s)
            return None