.pb 文件到 tflite 转换时无法解析文件错误

Cannot parse file error while .pb file to tflite conversion

您好,我在 tf1.15 中使用 pb 文件为自定义 albert 模型制作 tflite,但出现了

错误
raise IOError("Cannot parse file %s: %s." % (path_to_pb, str(e)))
OSError: Cannot parse file b'/home/choss/test2/freeze2/saved_model.pb': Error parsing message.

下面的代码是我如何制作 .pb 文件

meta_path = 'model.ckpt-400.meta'  # Your .meta file
output_node_names = ['loss/Softmax']    

with tf.Session() as sess:

    # Restore the graph
    saver = tf.train.import_meta_graph(meta_path)

    # Load weights
    ckpt ='/home/choss/test2/freeze2/model.ckpt-400'
    print(ckpt) 
    saver.restore(sess, ckpt)

    output_node_names = [n.name for n in tf.get_default_graph().as_graph_def().node]

    # Freeze the graph
    frozen_graph_def = tf.graph_util.convert_variables_to_constants(
        sess,
        sess.graph_def,
        output_node_names)

    # Save the frozen graph
    with open('saved_model.pb', 'wb') as f:
        f.write(frozen_graph_def.SerializeToString())

我尝试用下面的代码制作 tflite 文件

saved_model_dir = "/home/choss/test2/freeze2"
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

我用 f.graph_util.convert_variables_to_constants 因为 freeze_graph 因为

freeze_graph.freeze_graph('./graph.pbtxt', saver, False, 'model.ckpt-400', 'loss/ArgMax', "", "", 'frozen.pb', True, "")

给我一条错误信息

File "/home/pgb/anaconda3/envs/myenv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 2154, in __getitem__
    return self._inputs[i]
IndexError: list index out of range

难道是因为我没有使用freeze_graph? 如果是这样,除了 freeze_graph 之外还有其他方法吗?

与其自己冻结图形,我建议导出为 TF 保存的模型,并使用保存的模型转换器和最新的 TF 版本。您可以解耦用于训练和转换的 TensorFlow 版本。例如,可以在 TF 1.15 中进行训练,并可以从中导出保存的模型。然后,在 TensorFlow 2.4.1 或更高版本中,可以将保存的模型带到 TFLite 转换器API。