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
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
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))
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