def testBuildSignatureDef(self): # Force the test to run in graph mode. # This tests a deprecated v1 API that uses functionality that does not work # with eager tensors (namely build_tensor_info). with ops.Graph().as_default(): x = array_ops.placeholder(dtypes.float32, 1, name="x") x_tensor_info = utils.build_tensor_info(x) inputs = {} inputs["foo-input"] = x_tensor_info y = array_ops.placeholder(dtypes.float32, name="y") y_tensor_info = utils.build_tensor_info(y) outputs = {} outputs["foo-output"] = y_tensor_info signature_def = signature_def_utils_impl.build_signature_def( inputs, outputs, "foo-method-name") self.assertEqual("foo-method-name", signature_def.method_name) # Check inputs in signature def. self.assertEqual(1, len(signature_def.inputs)) x_tensor_info_actual = signature_def.inputs["foo-input"] self.assertEqual("x:0", x_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, x_tensor_info_actual.dtype) self.assertEqual(1, len(x_tensor_info_actual.tensor_shape.dim)) self.assertEqual(1, x_tensor_info_actual.tensor_shape.dim[0].size) # Check outputs in signature def. self.assertEqual(1, len(signature_def.outputs)) y_tensor_info_actual = signature_def.outputs["foo-output"] self.assertEqual("y:0", y_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, y_tensor_info_actual.dtype) self.assertEqual(0, len(y_tensor_info_actual.tensor_shape.dim))
def testBuildSignatureDef(self): x = array_ops.placeholder(dtypes.float32, 1, name="x") x_tensor_info = utils.build_tensor_info(x) inputs = {} inputs["foo-input"] = x_tensor_info y = array_ops.placeholder(dtypes.float32, name="y") y_tensor_info = utils.build_tensor_info(y) outputs = {} outputs["foo-output"] = y_tensor_info signature_def = signature_def_utils_impl.build_signature_def( inputs, outputs, "foo-method-name") self.assertEqual("foo-method-name", signature_def.method_name) # Check inputs in signature def. self.assertEqual(1, len(signature_def.inputs)) x_tensor_info_actual = signature_def.inputs["foo-input"] self.assertEqual("x:0", x_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, x_tensor_info_actual.dtype) self.assertEqual(1, len(x_tensor_info_actual.tensor_shape.dim)) self.assertEqual(1, x_tensor_info_actual.tensor_shape.dim[0].size) # Check outputs in signature def. self.assertEqual(1, len(signature_def.outputs)) y_tensor_info_actual = signature_def.outputs["foo-output"] self.assertEqual("y:0", y_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, y_tensor_info_actual.dtype) self.assertEqual(0, len(y_tensor_info_actual.tensor_shape.dim))
def testBuildSignatureDef(self): x = array_ops.placeholder(dtypes.float32, 1, name="x") x_tensor_info = utils.build_tensor_info(x) inputs = {} inputs["foo-input"] = x_tensor_info y = array_ops.placeholder(dtypes.float32, name="y") y_tensor_info = utils.build_tensor_info(y) outputs = {} outputs["foo-output"] = y_tensor_info signature_def = signature_def_utils_impl.build_signature_def( inputs, outputs, "foo-method-name") self.assertEqual("foo-method-name", signature_def.method_name) # Check inputs in signature def. self.assertEqual(1, len(signature_def.inputs)) x_tensor_info_actual = signature_def.inputs["foo-input"] self.assertEqual("x:0", x_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, x_tensor_info_actual.dtype) self.assertEqual(1, len(x_tensor_info_actual.tensor_shape.dim)) self.assertEqual(1, x_tensor_info_actual.tensor_shape.dim[0].size) # Check outputs in signature def. self.assertEqual(1, len(signature_def.outputs)) y_tensor_info_actual = signature_def.outputs["foo-output"] self.assertEqual("y:0", y_tensor_info_actual.name) self.assertEqual(types_pb2.DT_FLOAT, y_tensor_info_actual.dtype) self.assertEqual(0, len(y_tensor_info_actual.tensor_shape.dim))
def _make_signature(inputs, outputs, name=None): input_info = { input_name: utils.build_tensor_info(tensor) for input_name, tensor in inputs.items() } output_info = { output_name: utils.build_tensor_info(tensor) for output_name, tensor in outputs.items() } return signature_def_utils_impl.build_signature_def( input_info, output_info, name)
def _make_signature(inputs, outputs, name=None): input_info = { input_name: utils.build_tensor_info(tensor) for input_name, tensor in inputs.items() } output_info = { output_name: utils.build_tensor_info(tensor) for output_name, tensor in outputs.items() } return signature_def_utils_impl.build_signature_def(input_info, output_info, name)
def main(_): print("Start the training...") #import model model = VGG16(weights = 'imagenet', include_top = True) sgd = SGD(lr = 0.1, decay = 1e-6, momentum = 0.9, nesterov = True) #compile the model model.compile(optimizer = sgd, loss = 'categorical_crossentropy') #view the properties of the model model.summary() #get input layer input_layer = model.get_layer('input_1') input_layer_in = input_layer.input print("The input layer: ", input_layer_in) #get predictions layer predictions_layer = model.get_layer('predictions') predictions_layer_out = predictions_layer.output print("The predictions layer: ", predictions_layer_out) #convert input layer and predictions layer from tensor to tensor info input_layer_in_info = build_tensor_info(input_layer_in) predictions_layer_out_info = build_tensor_info(predictions_layer_out) #export model K.set_learning_phase(0) export_path_base = "./vgg16" model_version = "1" export_path = os.path.join( tf.compat.as_bytes(export_path_base), tf.compat.as_bytes(model_version)) print("Exporting trained model to: ", export_path) prediction_signature = build_signature_def( inputs = {'images': input_layer_in_info}, outputs = {'scores': predictions_layer_out_info}, method_name = signature_constants.PREDICT_METHOD_NAME) builder = saved_model_builder.SavedModelBuilder(export_path) with K.get_session() as sess: builder.add_meta_graph_and_variables( sess = sess, tags = [tag_constants.SERVING], signature_def_map = {'predict_images': prediction_signature}) builder.save() #clear session K.clear_session() print("Done exporting!")
def _create_signature(model, class_names: List[str], top_k: Optional[int]): serialized_tf_example = array_ops.placeholder(tf.string, name="tf_example") feature_configs = {"x": tf.io.FixedLenFeature([], tf.string)} tf_example = tf.io.parse_example(serialized_tf_example, feature_configs) jpegs = tf_example["x"] x = tf.map_fn(_preprocess_image, jpegs, dtype=tf.float32) y = model(x) top_k = min(top_k or len(class_names), len(class_names)) values, indices = tf.nn.top_k(y, top_k) table_class_names = lookup_ops.index_to_string_table_from_tensor( vocabulary_list=tf.constant(class_names), default_value="UNK", name=None) classification_inputs = build_tensor_info(serialized_tf_example) prediction_class_names = table_class_names.lookup( tf.cast(indices, dtype=dtypes.int64)) classification_outputs_class_names = build_tensor_info( prediction_class_names) classification_outputs_scores = build_tensor_info(values) classification_signature = build_signature_def( inputs={sig_consts_v1.CLASSIFY_INPUTS: classification_inputs}, outputs={ sig_consts_v1.CLASSIFY_OUTPUT_CLASSES: classification_outputs_class_names, sig_consts_v1.CLASSIFY_OUTPUT_SCORES: classification_outputs_scores, }, method_name=sig_consts_v1.CLASSIFY_METHOD_NAME, ) # Ensure valid signature if not is_valid_signature(classification_signature): raise ValueError("Invalid classification signature!") return classification_signature
def _assertInvalidSignature(self, inputs, outputs, method_name): signature_def = signature_def_utils_impl.build_signature_def( inputs, outputs, method_name) self.assertFalse( signature_def_utils_impl.is_valid_signature(signature_def))
def main(_): print("Start the training...") #import model model = VGG16(weights='imagenet', include_top=True, input_shape=(224, 224, 3)) #get input layer input_layer = model.get_layer('input_1') input_layer_in = input_layer.input #get block5_pool layer block5_pool = model.get_layer('block5_pool') block5_pool_out = block5_pool.output #get prediction layer predictions_layer = model.get_layer('predictions') predictions_layer_out = predictions_layer.output #create new model using additional output of bottleneck features vgg16_b_f_model = Model(inputs=input_layer_in, outputs=[block5_pool_out, predictions_layer_out]) #view the summary of the new model vgg16_b_f_model.summary() #get input layer b_f_input_layer = vgg16_b_f_model.get_layer('input_1') b_f_input_layer_in = b_f_input_layer.input print("The input layer: ", b_f_input_layer_in) #get output layer vgg16_b_f_outputs = vgg16_b_f_model.outputs #convert input layer, block5 pool layer, and predictions layer from tensor to tensor info input_layer_in_info = build_tensor_info(b_f_input_layer_in) block5_pool_out_info = build_tensor_info(vgg16_b_f_outputs[0]) predictions_layer_out_info = build_tensor_info(vgg16_b_f_outputs[1]) print("The block5_pool layer: ", block5_pool_out_info) print("The predictions layer: ", predictions_layer_out_info) #export model K.set_learning_phase(0) export_path_base = "./vgg16_bottleneck-features" model_version = "1" export_path = os.path.join(tf.compat.as_bytes(export_path_base), tf.compat.as_bytes(model_version)) print("Exporting trained model to: ", export_path) prediction_signature = build_signature_def( inputs={'images': input_layer_in_info}, outputs={ 'scores_1': block5_pool_out_info, 'scores_2': predictions_layer_out_info }, method_name=signature_constants.PREDICT_METHOD_NAME) builder = saved_model_builder.SavedModelBuilder(export_path) with K.get_session() as sess: builder.add_meta_graph_and_variables( sess=sess, tags=[tag_constants.SERVING], signature_def_map={'predict_images': prediction_signature}) builder.save() #clear session K.clear_session() print("Done exporting!")
def _assertInvalidSignature(self, inputs, outputs, method_name): signature_def = signature_def_utils_impl.build_signature_def( inputs, outputs, method_name) self.assertFalse( signature_def_utils_impl.is_valid_signature(signature_def))