将keras模型转换为tensorflow lite,得到;失败的预处理错误“;

将keras模型转换为tensorflow lite,得到;失败的预处理错误“;,tensorflow,keras,lstm,tensorflow-lite,Tensorflow,Keras,Lstm,Tensorflow Lite,我在keras中有一个模型,使用1层带双向包装的LSTM,我想将其转换为tensorflowlite 我在训练模型以保存模型和最佳权重时使用回调ModelCheckpoint 然后,我使用以下代码从检查点重新加载经过最佳训练的模型: predictor = None path_Load = os.path.join(os.getcwd(),'LSTMB_CheckPoints.hdf5') predictor = load_model(path_Load) predictor.load_weig

我在
keras
中有一个模型,使用1层带双向包装的LSTM,我想将其转换为
tensorflow
lite

我在训练模型以保存模型和最佳权重时使用回调
ModelCheckpoint

然后,我使用以下代码从检查点重新加载经过最佳训练的模型:

predictor = None
path_Load = os.path.join(os.getcwd(),'LSTMB_CheckPoints.hdf5')
predictor = load_model(path_Load)
predictor.load_weights(path_Load)
在检查验证数据后,模型成功加载并按预期工作。现在我想把它转换成Tensorflow Lite,并在stackoverflow上找到一些代码-

keras_file = path_Load
converter = tf.lite.TFLiteConverter.from_keras_model_file(keras_file)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
我想可能是检查点文件导致了问题,所以我重新保存了模型,并使用-

keras_file = "keras_model.h5"
tf.keras.models.save_model(predictor, keras_file)
converter = tf.lite.TFLiteConverter.from_keras_model_file(keras_file)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
因此我得到了这个错误-

tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value bidirectional_1/backward_lstm_1/kernel
     [[{{node _retval_bidirectional_1/backward_lstm_1/kernel_0_0}}]]
我尝试运行tensorflow的全局变量初始化函数

predictor = None
path_Load = os.path.join(os.getcwd(),'LSTMB_CheckPoints.hdf5')
predictor = load_model(path_Load)
predictor.load_weights(path_Load)
with tf.Session() as sess:
     sess.run(tf.global_variables_initializer())
keras_file = "keras_model.h5"
tf.keras.models.save_model(predictor, keras_file)
converter = tf.lite.TFLiteConverter.from_keras_model_file(keras_file)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
在重新保存模型之前,检查模型变量是否未初始化,但错误仍然存在


有没有人遇到过类似的问题并找到了解决方案?有没有一种方法可以在不保存和重新加载文件的情况下直接将顺序模型转换为tflite?

您应该将模型保存在.pb文件中。 首先,如果之前保存了模型,请加载该模型,然后运行

YOUR_MODEL.save('NAME.pb').
现在您有了一个文件夹,其中包含已保存的model.pb和其他必要的文件和文件夹。 创建转换器实例:

convertor = tensorflow.lite.TFLiteConverter.from_saved_model('NAME.pb').
最后,转换模型并保存:

tfmodel = converter.convert()
open("model.tflite","wb").write(tfmodel)

首先需要通过运行以下命令将模型保存为.h5格式

model.save("model.h5")
然后,按照这些步骤进行操作

new_model= tf.keras.models.load_model(filepath="model.h5")
tflite_converter = tf.lite.TFLiteConverter.from_keras_model(new_model)
tflite_model = tflite_converter.convert()
open("tf_lite_model.tflite", "wb").write(tflite_model)

TensorFlow Lite中尚不支持LSTM op。您可以试试。@ShubhamPanchal我尝试过使用类似-
converter=tf.lite.TFLiteConverter.from\u saved\u model(saved\u model\u dir)converter.target\u spec.supported\u ops=[tf.lite.optset.TFLITE\u内置,tf.lite.optset.选择[tf\u ops]TFLITE\u model=converter.convert()打开(目标路径,“wb”)。写入(tflite_model)
但我收到了错误-运行时错误:在SavedModel中找不到与标记{'serve'}关联的MetaGraphDef。若要检查SavedModel中的可用标记集,请使用SavedModel CLI:
saved_model_CLI