diff --git a/examples/keras_multiple_inputs_saved_model.rs b/examples/keras_multiple_inputs_saved_model.rs new file mode 100644 index 0000000000..e117592dc7 --- /dev/null +++ b/examples/keras_multiple_inputs_saved_model.rs @@ -0,0 +1,54 @@ +use tensorflow::{Graph, SavedModelBundle, SessionOptions, SessionRunArgs, Tensor}; + +fn main() { + // In this file test_in_input is being used while in the python script, + // that generates the saved model from Keras model it has a name "test_in". + // For multiple inputs _input is not being appended to signature input parameter name. + let signature_input_1_parameter_name = "test_in1"; + let signature_input_2_parameter_name = "test_in2"; + let signature_output_parameter_name = "test_out"; + + let save_dir = "examples/keras_multiple_inputs_saved_model"; + + let tensor1: Tensor = Tensor::from(&[0.1, 0.2, 0.3, 0.4, 0.5][..]); + let tensor2: Tensor = Tensor::from(&[0.6, 0.7, 0.8, 0.9, 0.1][..]); + let mut graph = Graph::new(); + + let bundle = SavedModelBundle::load(&SessionOptions::new(), &["serve"], &mut graph, save_dir) + .expect("Can't load saved model"); + + let session = &bundle.session; + + let signature = bundle + .meta_graph_def() + .get_signature("serving_default") + .unwrap(); + let input_info1 = signature + .get_input(signature_input_1_parameter_name) + .unwrap(); + let input_info2 = signature + .get_input(signature_input_2_parameter_name) + .unwrap(); + let output_info = signature + .get_output(signature_output_parameter_name) + .unwrap(); + + let input_op1 = graph + .operation_by_name_required(&input_info1.name().name) + .unwrap(); + let input_op2 = graph + .operation_by_name_required(&input_info2.name().name) + .unwrap(); + let output_op = graph + .operation_by_name_required(&output_info.name().name) + .unwrap(); + let mut args = SessionRunArgs::new(); + args.add_feed(&input_op1, 0, &tensor1); + args.add_feed(&input_op2, 0, &tensor2); + let out = args.request_fetch(&output_op, 0); + session + .run(&mut args) + .expect("Error occured during calculations: {:?}"); + let out_res: f32 = args.fetch(out).unwrap()[0]; + println!("Results: {:?}", out_res); +} diff --git a/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py new file mode 100644 index 0000000000..95615530da --- /dev/null +++ b/examples/keras_multiple_inputs_saved_model/keras_multiple_inputs_saved_model.py @@ -0,0 +1,40 @@ +import tensorflow as tf; +from tensorflow.python import keras +from tensorflow.keras import Sequential +from tensorflow.keras.layers import Dense +from tensorflow.keras.layers import Input +from tensorflow.keras.layers import Flatten +from tensorflow.keras.layers import Concatenate +from tensorflow.keras import Model +import numpy as np + +input = Input((5)) +x = Flatten()(input) +x = Dense(3,'relu')(x) +dense = Model(input, x) + +input1 = Input((5), name='test_in1') +input2 = Input((5), name='test_in2') + +dense1 = dense(input1) +dense2 = dense(input2) + +merge_layer = Concatenate()([dense1, dense2]) +dense_layer = Dense(1, activation="sigmoid", name='test_out')(merge_layer) + +model = Model(inputs=[input1, input2], outputs=dense_layer) + +v1 = np.array([[0.1, 0.2, 0.3, 0.4, 0.5]]) +v2 = np.array([[0.6, 0.7, 0.8, 0.9, 0.1]]) +print(v1.shape) +print(v2.shape) + +x1, x2 = np.random.randn(100, 5), np.random.randn(100, 5) +print(x1.shape) +print(x2.shape) +y = np.random.randn(100, 1) + +outputs = np.array([1.0]); +model.compile(optimizer ='adam',loss='binary_crossentropy', metrics = ['accuracy']) +model.fit([v1, v2], outputs, epochs=1, batch_size=1) +model.save('examples/keras_multiple_inputs_saved_model', save_format='tf') diff --git a/examples/keras_multiple_inputs_saved_model/saved_model.pb b/examples/keras_multiple_inputs_saved_model/saved_model.pb new file mode 100644 index 0000000000..a4f7824da6 Binary files /dev/null and b/examples/keras_multiple_inputs_saved_model/saved_model.pb differ diff --git a/examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 b/examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000..a471e2cd4d Binary files /dev/null and b/examples/keras_multiple_inputs_saved_model/variables/variables.data-00000-of-00001 differ diff --git a/examples/keras_multiple_inputs_saved_model/variables/variables.index b/examples/keras_multiple_inputs_saved_model/variables/variables.index new file mode 100644 index 0000000000..66e5d3cd4e Binary files /dev/null and b/examples/keras_multiple_inputs_saved_model/variables/variables.index differ diff --git a/examples/keras_single_input_saved_model.rs b/examples/keras_single_input_saved_model.rs new file mode 100644 index 0000000000..b90c57c1bd --- /dev/null +++ b/examples/keras_single_input_saved_model.rs @@ -0,0 +1,50 @@ +use tensorflow::{Graph, SavedModelBundle, SessionOptions, SessionRunArgs, Tensor}; + +fn main() { + // In this file test_in_input is being used while in the python script, + // that generates the saved model from Keras model it has a name "test_in". + // For multiple inputs _input is not being appended to signature input parameter name. + let signature_input_parameter_name = "test_in_input"; + let signature_output_parameter_name = "test_out"; + + let save_dir = + "examples/keras_single_input_saved_model"; + let tensor: Tensor = Tensor::new(&[1, 5]) + .with_values(&[0.1, 0.2, 0.3, 0.4, 0.5]) + .expect("Can't create tensor"); + let mut graph = Graph::new(); + + let bundle = SavedModelBundle::load(&SessionOptions::new(), &["serve"], &mut graph, save_dir) + .expect("Can't load saved model"); + + let session = &bundle.session; + + let signature = bundle + .meta_graph_def() + .get_signature("serving_default") + .unwrap(); + + let input_info = signature.get_input(signature_input_parameter_name).unwrap(); + let output_info = signature + .get_output(signature_output_parameter_name) + .unwrap(); + + let input_op = graph + .operation_by_name_required(&input_info.name().name) + .unwrap(); + let output_op = graph + .operation_by_name_required(&output_info.name().name) + .unwrap(); + + let mut args = SessionRunArgs::new(); + args.add_feed(&input_op, 0, &tensor); + + let out = args.request_fetch(&output_op, 0); + + session + .run(&mut args) + .expect("Error occurred during calculations"); + let out_res: f32 = args.fetch(out).unwrap()[0]; + + println!("Results: {:?}", out_res); +} diff --git a/examples/keras_single_input_saved_model/keras_single_input_saved_model.py b/examples/keras_single_input_saved_model/keras_single_input_saved_model.py new file mode 100644 index 0000000000..b1b8444f78 --- /dev/null +++ b/examples/keras_single_input_saved_model/keras_single_input_saved_model.py @@ -0,0 +1,23 @@ +import tensorflow as tf; +from tensorflow.python import keras +from tensorflow.keras import Sequential +from tensorflow.keras.layers import Dense +import numpy as np; + +classifier = Sequential() +classifier.add(Dense(5, activation='relu', kernel_initializer='random_normal', name="test_in", input_dim=5)) +classifier.add(Dense(5, activation='relu')) +classifier.add(Dense(1, activation='sigmoid', name="test_out")) + +classifier.compile(optimizer ='adam', loss='binary_crossentropy', metrics = ['accuracy']) + +classifier.fit([[0.1, 0.2, 0.3, 0.4, 0.5]], [[1]], batch_size=1, epochs=1); +result = classifier.predict([[0.1, 0.2, 0.3, 0.4, 0.5]]) + +print(result); +classifier.summary(); + +for layer in classifier.layers: + print(layer.name) + +classifier.save('examples/keras_signle_input_saved_model', save_format='tf') diff --git a/examples/keras_single_input_saved_model/saved_model.pb b/examples/keras_single_input_saved_model/saved_model.pb new file mode 100644 index 0000000000..ae075ff008 Binary files /dev/null and b/examples/keras_single_input_saved_model/saved_model.pb differ diff --git a/examples/keras_single_input_saved_model/variables/variables.data-00000-of-00001 b/examples/keras_single_input_saved_model/variables/variables.data-00000-of-00001 new file mode 100644 index 0000000000..b38e7e3e1a Binary files /dev/null and b/examples/keras_single_input_saved_model/variables/variables.data-00000-of-00001 differ diff --git a/examples/keras_single_input_saved_model/variables/variables.index b/examples/keras_single_input_saved_model/variables/variables.index new file mode 100644 index 0000000000..f29e13ee82 Binary files /dev/null and b/examples/keras_single_input_saved_model/variables/variables.index differ