Wuthrich Julien
Wuthrich Julien

Reputation: 69

How to feed multiple inputs TFlite model in Python interpreter

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

Answers (2)

mcagriaksoy
mcagriaksoy

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

Alex K.
Alex K.

Reputation: 861

Use this flow:

  1. Get your inputs' parameters list: input_details = interpreter.get_input_details()

  2. Identify corresponding indexes to your data via matching type/shape from input_details

  3. Set your tensors according to inputs:

    interpreter.set_tensor(input_details[0]['index'], input_text)
    interpreter.set_tensor(input_details[1]['index'], input_intent)

  4. Invoke your model interpreter.invoke()

Details: Load and run a model in Python

Upvotes: 5

Related Questions