我在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,而无需保存和重新加载文件?
答案 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)