将keras模型转换为tensorflow lite会给出“ FailedPreconditionError”

时间:2019-09-16 13:17:38

标签: tensorflow keras lstm tensorflow-lite

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

我在训练模型时使用回调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,而无需保存和重新加载文件?

2 个答案:

答案 0 :(得分:0)

您应该将模型保存在.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)

答案 1 :(得分:0)

您首先需要通过运行

将模型保存为.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)