pythonkotlinandroid-studiotensorflowtensorflow-lite

The TFLite model does not load in android studio


I am building and training a neural network model on tensorflow version 2.17.0-nightly. After that I convert it to a tflite model. But when I try to load the model I get the following message: Didn't find op for builtin opcode 'FULLY_CONNECTED' version '12'. An older version of this builtin might be supported. Are you using an old TFLite binary with a newer model? Model Description:

self.model = tf.keras.models.Sequential([
            tf.keras.layers.LSTM(80, input_shape=input_shape, return_sequences=True),
            tf.keras.layers.LSTM(128, activation='tanh', return_sequences=False),
            tf.keras.layers.Dense(80, activation='relu'),
            tf.keras.layers.Dense(64, activation='relu'),
            tf.keras.layers.Dense(32, activation='relu'),
            tf.keras.layers.Dense(10, activation='sigmoid'),
            tf.keras.layers.Dense(4, activation='sigmoid')
        ])

Code for model conversion:

lstm_model = tf.keras.models.load_model('lstm_model_TEST.keras', custom_objects={'F1_score': F1_score})

# Convert the model.
run_model = tf.function(lambda x: lstm_model(x))

BATCH_SIZE = 1
STEPS = 10
INPUT_SIZE = 5

concrete_func = run_model.get_concrete_function(
    tf.TensorSpec([BATCH_SIZE, STEPS, INPUT_SIZE], lstm_model.inputs[0].dtype))

converter = tf.lite.TFLiteConverter.from_keras_model(lstm_model)

converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS
]
converter.experimental_new_converter = True

tflite_model = converter.convert()

# Save the model.
with open('model_LSTM.tflite', 'wb') as f:
    f.write(tflite_model)

tf.__version__ = 2.17.0-dev20240514

Dependencies in Android Studio:

 implementation("org.tensorflow:tensorflow-lite-support:0.4.4")
 implementation("org.tensorflow:tensorflow-lite-metadata:0.4.4")
 implementation("org.tensorflow:tensorflow-lite:2.16.1")
 implementation("org.tensorflow:tensorflow-lite-gpu:2.16.1")

Code for model download:

val model = ModelLstm.newInstance(this)

I tried converting a model without tf-nightly using tensorflow version 2.16.1, but the model did not convert


Solution

  • Recently, I had the same problem. It might be helpful to share, so i am posting some Colab codes below. I have used Tensorflow 2.15.0 for now, both on Google Colab and Android Studio. Below codes were needed to be able to successfully downgrade Tensorflow to 2.15.0. At least it was required in my environment.

    !pip install orbax-checkpoint==0.4.0
    !pip install tensorstore==0.1.40
    !pip install tf-keras==2.15.0
    !pip install tensorflow==2.15.0
    !pip install ml-dtypes==0.2.0
    

    To verify the Tensorflow version:

    print(tf.__version__)
    

    To convert the model:

    # Convert Keras model to TF Lite format.
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_float_model = converter.convert()
    
    # Show model size in KBs.
    float_model_size = len(tflite_float_model) / 1024
    print('Float model size = %dKBs.' % float_model_size)
    
    # Re-convert the model to TF Lite using quantization.
    converter.optimizations = [tf.lite.Optimize.DEFAULT]
    tflite_quantized_model = converter.convert()
    
    # Show model size in KBs.
    quantized_model_size = len(tflite_quantized_model) / 1024
    print('Quantized model size = %dKBs,' % quantized_model_size)
    print('which is about %d%% of the float model size.'\
          % (quantized_model_size * 100 / float_model_size))
    

    To download the model:

    # Save the quantized model to file to the Downloads directory
    f = open('hasyv2.tflite', "wb")
    f.write(tflite_quantized_model)
    f.close()
    
    # Download the digit classification model
    files.download('hasyv2.tflite')
    
    print('`hasyv2.tflite` has been downloaded')