How to convert keras(h5) file to a tflite file?

Viewed 43396

I got an keras(h5) file. I need to convert it to tflite?? I researched, First i need to go via h5 -> pb -> tflite (because h5 - tflite sometimes results in some issue)

10 Answers
from tensorflow.contrib import lite
converter = lite.TFLiteConverter.from_keras_model_file( 'model.h5')
tfmodel = converter.convert()
open ("model.tflite" , "wb") .write(tfmodel)

You can use the TFLiteConverter to directly convert .h5 files to .tflite file. This does not work on Windows.

For Windows, use this Google Colab notebook to convert. Upload the .h5 file and it will convert it .tflite file.

Follow, if you want to try it yourself :

  1. Create a Google Colab Notebook. In the left top corner, click the "UPLOAD" button and upload your .h5 file.
  2. Create a code cell and insert this code.

    from tensorflow.contrib import lite
    converter = lite.TFLiteConverter.from_keras_model_file( 'model.h5' ) # Your model's name
    model = converter.convert()
    file = open( 'model.tflite' , 'wb' ) 
    file.write( model )
    
  3. Run the cell. You will get a model.tflite file. Right click on the file and select "DOWNLOAD" option.

This worked for me on Windows 10 using Tensorflow 2.1.0 and Keras 2.3.1

import tensorflow as tf

model = tf.keras.models.load_model('model.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Just did this from CoLab using this code in a notebook:

import tensorflow as tf
model = tf.keras.models.load_model('yourmodel.h5')
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflmodel = converter.convert()
file = open( 'yourmodel.tflite' , 'wb' ) 
file.write( tflmodel )

I had difficulty uploading the h5 model via CoLab so I mounted my Google Drive, uploaded it there, and then moved it over to the notebook content folder.

Converting a GraphDef from the session.

converter = lite.TFLiteConverter.from_session(sess, in_tensors, out_tensors)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Converting a GraphDef from file.

converter = lite.TFLiteConverter.from_frozen_graph(
graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Converting a SavedModel.

converter = lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

If You are using Google Colab Notebook try this:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_keras_model_file('model.h5') 
tfmodel = converter.convert() 
open ('model.tflite' , "wb") .write(tfmodel)
import tensorflow as tf
from tensorflow import lite
from tensorflow.keras.models import load_model
converter = lite.TFLiteConverter.from_keras_model(model)
tfmodel = converter.convert()
open ("model.tflite" , "wb") .write(tfmodel)

This works for me. I am using keras==2.6.0 and tensorflow-cpu==2.5.0 version. For more information, you can visit https://www.tensorflow.org/guide/keras/save_and_serialize .

If you are using Tensorflow-2 then you can follow these steps:

import tensorflow as tf
from keras.models import load_model
model = load_model("model.h5")
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tfmodel = converter.convert()
open("model.tflite", "wb") .write(tfmodel)

In TF-2, it requires to load the Keras model instance and returns a converted instance. Check out this link for more details.

Only some specific version of Tensorflow and Keras works properly in all the os. I even tried toco command line but it has issues too. Use tensorflow==1.13.0-rc1 and keras==2.1.3

and then after this will work

from tensorflow.contrib import lite
converter = lite.TFLiteConverter.from_keras_model_file( 'model.h5' ) # Your model's name
model = converter.convert()
file = open( 'model.tflite' , 'wb' ) 
file.write( model )

Convert RetinaNet to tflite

import tensorflow as tf
from keras_retinanet.models import load_model
from keras.layers import Input
from keras.models import Model

def get_file_size(file_path):
    size = os.path.getsize(file_path)
    return size
    
def convert_bytes(size, unit=None):
    if unit == "KB":
        return print('File size: ' + str(round(size / 1024, 3)) + ' Kilobytes')
    elif unit == "MB":
        return print('File size: ' + str(round(size / (1024 * 1024), 3)) + ' Megabytes')
    else:
        return print('File size: ' + str(size) + ' bytes')

def convert_model_to_tflite(model_path = "/content/drive/MyDrive/Model/resnet152_csv_180_inference.h5", filename = "converted_model.tflite"):
  model = load_model(model_path)
  fixed_input = Input((416,416,3))
  fixed_model = Model(fixed_input,model(fixed_input))
  converter = tf.lite.TFLiteConverter.from_keras_model(model)
  converter.target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
    tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
  ]
  tflite_model = converter.convert()
  open(filename, "wb").write(tflite_model)
  print(convert_bytes(get_file_size("converted_model.tflite"), "MB"))
Related