Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Keras examples for single input and multiple inputs have been added. #286

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions examples/keras_multiple_inputs_saved_model.rs
Original file line number Diff line number Diff line change
@@ -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<f32> = Tensor::from(&[0.1, 0.2, 0.3, 0.4, 0.5][..]);
let tensor2: Tensor<f32> = 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);
}
Original file line number Diff line number Diff line change
@@ -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')
Binary file not shown.
Binary file not shown.
Binary file not shown.
50 changes: 50 additions & 0 deletions examples/keras_single_input_saved_model.rs
Original file line number Diff line number Diff line change
@@ -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<f32> = 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);
}
Original file line number Diff line number Diff line change
@@ -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')
Binary file not shown.
Binary file not shown.
Binary file not shown.