.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。
您好,我在 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。