Reputation: 69
How can you feed 2 inputs within a tflite model.
I built a tf model => convert into tflite
text = tf.keras.Input((64), name="text")
intent = tf.keras.Input(shape=(25,), name="intent")
layer = tf.keras.layers.Embedding(dataset.vocab_size, 128, name="embedding_layer")(text)
layer = tf.keras.layers.LocallyConnected1D(256, kernel_size=1, strides=1, padding="valid", activation="relu")(layer)
layer = tf.keras.layers.SpatialDropout1D(0.1)(layer)
layer = tf.keras.layers.GlobalAveragePooling1D()(layer)
layer = tf.keras.layers.Dense(512, activation="relu")(layer)
layer = tf.keras.layers.Dropout(0.1)(layer)
layer = tf.keras.layers.concatenate([layer, intent])
output_layer = tf.keras.layers.Dense(units=dataset.max_labels, activation="softmax")(layer)
model = tf.keras.models.Model(inputs=[text, intent], outputs=[output_layer])
My model has 2 inputs.
interpreter.get_input_details():
[{'name': 'text',
'index': 0,
'shape': array([ 1, 64], dtype=int32),
'shape_signature': array([ 1, 64], dtype=int32),
'dtype': numpy.float32,
'quantization': (0.0, 0),
'quantization_parameters': {'scales': array([], dtype=float32),
'zero_points': array([], dtype=int32),
'quantized_dimension': 0},
'sparsity_parameters': {}},
{'name': 'intent',
'index': 1,
'shape': array([ 1, 32], dtype=int32),
'shape_signature': array([ 1, 32], dtype=int32),
'dtype': numpy.float32,
'quantization': (0.0, 0),
'quantization_parameters': {'scales': array([], dtype=float32),
'zero_points': array([], dtype=int32),
'quantized_dimension': 0},
'sparsity_parameters': {}}]
How can I feed my tflite model with 2 inputs ? Using set_tensor we can only pass 1 input...
interpreter.set_tensor(interpreter.get_input_details()[0]['index'], input_text)
i want something like
interpreter.set_tensor([interpreter.get_input_details()[0]['index'], interpreter.get_input_details()[1]['index']], [input_text, input_intent])
Thanks guys =D
Upvotes: 3
Views: 4309
Reputation: 90
you can implement and test it like:
# Load TFLite model and allocate tensors.
interpreter = tf.lite.Interpreter(model_path="MODELNAME.tflite")
interpreter.allocate_tensors()
# Get input and output tensors.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# Test model on some input data.
input_shape = input_details[0]['shape']
input_shape1 = input_details[1]['shape']
acc=0
for i in range(len(x_test)):
input_text = np.array(X_TEST[i].reshape(input_shape), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_text)
input_intent= np.array(X_INPUT[i].reshape(input_shape1), dtype=np.float32)
interpreter.set_tensor(input_details[1]['index'], input_intent)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
if(np.argmax(output_data) == np.argmax(y_test[i])): #CHANGE Y_TEST ACCORDINGLY
acc+=1
acc = acc/len(x_test)
print(acc*100)
Upvotes: 1
Reputation: 861
Use this flow:
Get your inputs' parameters list: input_details = interpreter.get_input_details()
Identify corresponding indexes to your data via matching type/shape from input_details
Set your tensors according to inputs:
interpreter.set_tensor(input_details[0]['index'], input_text)
interpreter.set_tensor(input_details[1]['index'], input_intent)
Invoke your model interpreter.invoke()
Details: Load and run a model in Python
Upvotes: 5